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

时间:2011-08-12 13:25:50

标签: c++ multithreading winapi synchronization

我有一个线程将数据放入缓冲区和多个线程,这些线程将从缓冲区读取它们的数据部分。

如何创建满足这些要求的同步机制:

  1. Writer线程将所有数据写入缓冲区并让所有读取器线程同时运行(好吧,我用Semaphore做了)。然后等待所有人完成他们的回合。我不能使用WaitForMultipleObjects,因为线程没有终止,而是一轮循环结束。也许每个读者线程都有一个事件,当循环结束时它们会发出信号并且Writer将使用WaitForMultipleObjects等待所有线程完成它们的循环循环?
  2. 读者线程读取他们的数据,为该轮做他们的工作,并以某种方式让Writer线程放下一个数据。请注意,当所有主题完成轮次时,Writer应该开始下一轮循环。
  3. 如何实施这样的机制?正如我所说,我唯一能想到的似乎是:

    编剧:

    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!
    }
    

    有什么更好的方法可以做到这一点?

2 个答案:

答案 0 :(得分:3)

您应该使用Readers-writer lock

在Windows中有一个Slim Reader/Writer lock我建议您查看。

答案 1 :(得分:1)

如果您使用的是VC10,最好使用Concurrency::unbounded_buffer类,它将为您处理所有事情。只需使用Concurrency::sendConcurrency::asend向其添加消息; Concurrency::receiveConcurrency::try_receive从中读取消息。该类实现FIFO。可以有多个读者以及多个作者。