首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

多线程共享很多变量的同步有关问题

2012-03-17 
多线程共享很多变量的同步问题 - C++ Builder / Windows SDK/API我的程序是服务器程序,有5个线程,可能会有

多线程共享很多变量的同步问题 - C++ Builder / Windows SDK/API
我的程序是服务器程序,有5个线程,可能会有几百个连接,每个连接对就一块数据缓冲区,防止连接相互干扰,多个线程都可能访问任何一个数据缓冲区,如果采用一般的同步方法,需要每块数据缓冲区建立一个临界区或互斥体等,我担心占用系统资源太多。因此采用了另一个办法,代码如下:

C/C++ code
void __fastcall ServerOverPort::SetSockBusy(PER_IO_DATA *PerIo,int Flags) //设置发送为繁忙{if(PerIo)//PerIo内包含了数据缓冲区,连接sock等信息ReSend:  {EnterCriticalSection(Lock);//Lock是指向临界区的指针  if(PerIo->SendOrRecv ==0)    {PerIo->SendOrRecv=Flags;    }  else    {LeaveCriticalSection(Lock);     Sleep(10);     goto ReSend;    }  LeaveCriticalSection(Lock);  }};

我认为每次收发数据前,调用一下本函数Flags设为1,发送完成后调用设Flags为0,接收处理数据完成后设置Flags为0,这样就能保证同时只有一个线程在读写数据缓冲区。
问题一、目前来看,运行能达到同步的作用,不知这样做是否还有其它我没发现的问题
问题二、函数循环等待PerIo->SendOrRecv被设置成0,占用较多CPU时间,效率较低,Sleep如果时间设置太大,可能会丢包,有没有更好的办法解决我的问题

[解决办法]
没太研究这方面,感觉线程中Sleep不是很好的办法
[解决办法]
你这个Flags的标记其实不就是个读取的临界区域么,我觉得直接用EnterCriticalSection就行,还有这个sleep,你可以用事件的,TEvent和WaitForSingleObject结合
[解决办法]
既然是同步,还是用Windows内核对象好
[解决办法]
用互锁函数来进行同步
[解决办法]
你的方法和临界区没有区别。
要效率高可以用多重读独占写。

热点排行