多线程共享很多变量的同步有关问题
多线程共享很多变量的同步问题 - C++ Builder / Windows SDK/API我的程序是服务器程序,有5个线程,可能会有
多线程共享很多变量的同步问题 - C++ Builder / Windows SDK/API
我的程序是服务器程序,有5个线程,可能会有几百个连接,每个连接对就一块数据缓冲区,防止连接相互干扰,多个线程都可能访问任何一个数据缓冲区,如果采用一般的同步方法,需要每块数据缓冲区建立一个临界区或互斥体等,我担心占用系统资源太多。因此采用了另一个办法,代码如下:
C/C++ codevoid __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内核对象好
[解决办法]用互锁函数来进行同步
[解决办法]你的方法和临界区没有区别。
要效率高可以用多重读独占写。