【发布时间】:2018-04-29 13:09:58
【问题描述】:
我必须对输入文件 (1...N) 执行 OperationA,然后我必须对 operationA 完成的文件执行 OperationB。
所以在主线程中我遍历每个文件(1...N)并执行操作A。然后将文件推送到线程安全队列并继续处理下一个文件。工作线程从队列中获取文件并执行操作 B。 为了实现这一点,我使用了如下事件:
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 已经被触发。但这并没有按预期工作。
- 设置事件
- WaitforSingleObject
- 设置事件
- 设置事件
- 设置事件
- WaitforSingleObject
- 设置事件
- 设置事件
- WaitforSingleObject
我为 6 个文件调用了 6 个 setevent。但是 WaitforSingleObject 只发出 3 个信号。
首先请告诉我我是否使用了正确的上下文同步机制?
【问题讨论】:
-
你要包含哪些库?
-
事件基本上只是一个布尔标志。在已设置的事件上调用
SetEvent是无操作的。只要让你的工作线程处理所有队列项,直到队列为空,只要它醒来。 -
如果您没有为了简化示例而遗漏它,您可能需要一些保护,一个互斥锁或您所拥有的,围绕队列。
-
@Arash Mohammadi - Win32/STL
-
这一切都取决于您的实现,这从您的问题中还不够清楚。你的信号系统是如何工作的?您是否存储了工作人员每次完成当前任务时都可以检查的事件队列?
标签: c++ multithreading synchronization