如何在WinAPI中创建一对多的等待机制
How to create a one-to-many wait mechanism in WinAPI
我有一个将数据放入缓冲区的线程和多个将从缓冲区读取其部分数据的线程。
我如何创建一个同步机制来满足这些需求:
- 写线程将所有数据写入缓冲区,并让所有读线程同时运行(好吧,我用Semaphore做了)。然后等待所有完成他们的回合。我不能使用WaitForMultipleObjects,因为线程没有终止,而是一轮循环结束。也许每个reader线程都有一个事件,当循环结束时,它们将向它发出信号,Writer将使用WaitForMultipleObjects来等待所有线程完成循环?
- Reader线程读取它们的数据,完成它们的工作,然后让Writer线程放入下一个数据。请注意,Writer应该在所有线程完成它们的循环时开始下一轮循环。
如何实现这种机制?正如我所说,我唯一能想到的似乎是:
作者:
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!
}
有什么更好的方法?
应该使用读写锁。
在Windows中有一个Slim Reader/Writer锁,我建议你看看。
如果您正在使用VC10,您最好使用Concurrency::unbounded_buffer类,它将为您处理所有事情。只需使用Concurrency::send
、Concurrency::asend
向其附加消息即可;Concurrency::receive
, Concurrency::try_receive
从中读取消息。这个类实现了FIFO。可以有多个读者,也可以有多个作者。
相关文章:
- 一个线程等待多个线程事件
- C++11 - 可以等待多个不同事件的线程?
- 使用通知全部进行多次等待
- 可以在同一条件变量上等待多个线程
- 如何等待多个线程完成(使用 c++11 线程)
- 解决死锁问题,在主线程中等待多个工作线程完成 (C++11)
- C++:使用一对(cpp_int,int)整数作为无序映射中的键(其中cpp_int是boost多精度整数)
- 如何在不让用户等待的情况下管理多个线程
- 测试队列中等待condition_variables的多个线程
- boost上的多个递归异步等待
- 如何使一个线程按预期顺序多次等待另一个线程
- 在 C++11 中从多个线程获取值,而无需等待任何给定线程完成执行
- 为什么 Boost 原子使用中的多生产者队列是免等待的
- 多线程程序挂起条件等待
- std::future 或 std::shared_future 等待多个线程
- 等待多个线程启动,start() 未捕获
- 映射一对多关系
- 在一对多映射中搜索一个密钥
- 如何在WinAPI中创建一对多的等待机制
- 如何管理对象之间的一对多关系?(移动相关)