我有一个线程将数据放入缓冲区和多个线程,这些线程将从缓冲区读取它们的数据部分。
如何创建满足这些要求的同步机制:
如何实施这样的机制?正如我所说,我唯一能想到的似乎是:
编剧:
for (;;)
{
PutDataIntoBuffer();
for (i = 0; i < threadCount; ++i)
{
ResetEvent(threadEvents[i]); //so that all events will be nonsignaled
}
ReleaseSemaphore(sem, threadCount, NULL);
WaitForMultipleObjects(threadCount, threadEvents, TRUE, INFINITE);
}
读者:
for (;;)
{
WaitForSingleObject(sem, INFINITE);
DoWhateverToBeDoneWithData();
SetEvent(threadEvents[myThreadIndex]); //writer, wait for me too!
}
有什么更好的方法可以做到这一点?
答案 0 :(得分:3)
您应该使用Readers-writer lock。
在Windows中有一个Slim Reader/Writer lock我建议您查看。
答案 1 :(得分:1)
如果您使用的是VC10,最好使用Concurrency::unbounded_buffer类,它将为您处理所有事情。只需使用Concurrency::send
,Concurrency::asend
向其添加消息; Concurrency::receive
,Concurrency::try_receive
从中读取消息。该类实现FIFO。可以有多个读者以及多个作者。