从主线程

时间:2017-11-16 05:16:29

标签: c++ multithreading synchronization

我必须对输入文件(1 ... N)执行OperationA,之后我必须在operationA完成的文件上执行OperationB。

所以在主线程中我遍历每个文件(1 ... N)并执行operationA。然后将文件推送到线程安全队列并继续下一个文件。工作线程从队列中获取文件并执行operationB。 为了实现这一点,我使用了以下事件:

HANDLE hEvent =CreateEvent(NULL, FALSE/*autoreset*/, FALSE/*nonsignaled*/, "");
for( files 1... N)
{
   1. Operation A
   2. Push file to the queue
   3. SetEvent( hEvent )
}

WorkerThread()
{
   while(1)
   {
      1. WaitforSingleObject( hEvent , INFINITE )
      2. operation B
   }
}

我期待的是每个SetEvent()将发信号通知WaitforSingleObject()。 但实际行为不是。 I.e对于第一个SetEvent,发出WaitforSingleObject信号。 当operationB正在进行时,许多SetEvents正在从主线程触发。所以下一个WaitforSingleObject()应该没有任何延迟信号,因为第二个SetEvent已经被trigerred。但这并没有像预期的那样发挥作用。

  • SetEvent的
    • WaitforSingleObject
  • SetEvent的
  • SetEvent的
  • SetEvent的
    • WaitforSingleObject
  • SetEvent的
  • SetEvent的
    • WaitforSingleObject

我为6个文件调用了6个setevent。但WaitforSingleObject只发出3信号。

首先,请让我知道我是否正在使用正确的同步机制?

1 个答案:

答案 0 :(得分:1)

这是生产者 - 消费者问题,您可以使用信号量来完成。

点击此链接https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem

您的代码在链接中的实现不充分。

使用信号量,代码将按预期运行。