我必须在输入文件(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()信号。
但是实际行为并非如此。
即,对于第一个SetEvent,用信号通知WaitforSingleObject。
在operationB进行期间,许多SetEvents从主线程触发。因此,下一个WaitforSingleObject()应该没有任何延迟地发出信号,因为第二个SetEvent已经触发。但这没有按预期工作。
  • SetEvent
  • WaitforSingleObject
  • SetEvent
  • SetEvent
  • SetEvent
  • WaitforSingleObject
  • SetEvent
  • SetEvent
  • WaitforSingleObject

  • 我将6个文件称为6 setevent。但是WaitforSingleObject仅发出3个信号。

    首先,请让我知道我是否针对上下文使用了正确的同步机制?

    最佳答案

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

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

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

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

    10-06 14:43