我必须对输入文件(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。但这并没有像预期的那样发挥作用。
我为6个文件调用了6个setevent。但WaitforSingleObject只发出3信号。
首先,请让我知道我是否正在使用正确的同步机制?
答案 0 :(得分:1)
这是生产者 - 消费者问题,您可以使用信号量来完成。
点击此链接https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem
您的代码在链接中的实现不充分。
使用信号量,代码将按预期运行。