关于UDP多进程与信号量控制共享内存读写问题
遇到点疑惑,求大神指点!
写了个UDP的服务器,一开始开了十来个进程,用于逻辑处理;开了一段共享内存,用于保存接收到的要等待处理的数据;用了两个信号量:信号量一用于消费者(十来个进程)通知生产者(recvfrom进程)数据已经取走,缓冲区已经可以写入新数据。信号量二用于生产者(recvfrom进程)通知消费者(十来个进程)新数据已经产生,消费者可以读取新产生的数据。
模型如下:
recvfrom进程(生产者) 十来个进程(消费者)
while( 1 ) while( 1 )
{ {
P( 信号量一 ); P( 信号量二 );
写入数据到共享内存; 读取共享内存数据;
V( 信号量二 ); V( 信号量一 );
处理。。。。
} }
问题就是:当十来个进程队列的某个进程在锁定这块共享内存读取数据的时候,这时候有大量并发的数据到recvfrom,这样recvfrom是否会因阻塞等待在P(信号一)而出现丢报?
如何去避免和处理比较好?有没有其他更好的模型处理一个进程接收写进共享内存,其他众多进程从共享内存读取数据,如何做到共享内存进程数据的同步?
共享内存 信号量 多进程 udp PV原子操作
[解决办法]
生产者可以創建多一個線程來接收新的数据
[解决办法]
《Windows核心编程》
Synchronization Functions
The following functions are used in synchronization.
CancelWaitableTimer
CreateEvent
CreateMutex
CreateSemaphore
CreateWaitableTimer
DeleteCriticalSection
EnterCriticalSection
GetOverlappedResult
InitializeCriticalSection
InitializeCriticalSectionAndSpinCount
InterlockedCompareExchange
InterlockedDecrement
InterlockedExchange
InterlockedExchangeAdd
InterlockedIncrement
LeaveCriticalSection
MsgWaitForMultipleObjects
MsgWaitForMultipleObjectsEx
OpenEvent
OpenMutex
OpenSemaphore
OpenWaitableTimer
PulseEvent
QueueUserAPC
ReleaseMutex
ReleaseSemaphore
ResetEvent
SetCriticalSectionSpinCount
SetEvent
SetWaitableTimer
SignalObjectAndWait
TimerAPCProc
TryEnterCriticalSection
WaitForMultipleObjects
WaitForMultipleObjectsEx
WaitForSingleObject
WaitForSingleObjectEx