如何在WinAPI中创建一对多的等待机制

How to create a one-to-many wait mechanism in WinAPI

本文关键字:一对多 等待 机制 创建 WinAPI      更新时间:2023-10-16

我有一个将数据放入缓冲区的线程和多个将从缓冲区读取其部分数据的线程。

我如何创建一个同步机制来满足这些需求:

  1. 写线程将所有数据写入缓冲区,并让所有读线程同时运行(好吧,我用Semaphore做了)。然后等待所有完成他们的回合。我不能使用WaitForMultipleObjects,因为线程没有终止,而是一轮循环结束。也许每个reader线程都有一个事件,当循环结束时,它们将向它发出信号,Writer将使用WaitForMultipleObjects来等待所有线程完成循环?
  2. 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::sendConcurrency::asend向其附加消息即可;Concurrency::receive, Concurrency::try_receive从中读取消息。这个类实现了FIFO。可以有多个读者,也可以有多个作者。