我必须在输入文件(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已经触发。但这没有按预期工作。
我将6个文件称为6 setevent。但是WaitforSingleObject仅发出3个信号。
首先,请让我知道我是否针对上下文使用了正确的同步机制?
最佳答案
这是生产者-消费者问题,您可以使用信号量来解决。
检查此链接https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem
您的代码在链接中的实现不足。
使用信号量,代码将按预期运行。