C++ 从主线程向workerthread发送信号时出现问题
我必须对输入文件(1…N)执行操作A,然后我必须对已完成的文件执行操作B 因此,在主线程中,我迭代了每个文件(1…N),并执行操作A。然后将文件推送到线程安全队列,并继续下一个文件。工作线程从队列中获取文件并执行操作B。 为了实现这一点,我使用了如下事件:C++ 从主线程向workerthread发送信号时出现问题,c++,multithreading,synchronization,C++,Multithreading,Synchronization,我必须对输入文件(1…N)执行操作A,然后我必须对已完成的文件执行操作B 因此,在主线程中,我迭代了每个文件(1…N),并执行操作A。然后将文件推送到线程安全队列,并继续下一个文件。工作线程从队列中获取文件并执行操作B。 为了实现这一点,我使用了如下事件: HANDLE hEvent =CreateEvent(NULL, FALSE/*autoreset*/, FALSE/*nonsignaled*/, ""); for( files 1... N) { 1. Operation A
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发出信号。
当操作B正在进行时,许多SetEvents正在从主线程触发。因此,下一个WaitforSingleObject()应该在没有任何延迟的情况下发出信号,因为第二个SetEvent已经触发。但这并不像预期的那样有效
- SetEvent
- WaitforSingleObject
- SetEvent
- SetEvent
- SetEvent
- WaitforSingleObject
- SetEvent
- SetEvent
- WaitforSingleObject
首先,请让我知道我是否为上下文使用了正确的同步机制?这是生产者-消费者问题,您可以使用信号量来解决 检查此链接 您的代码在链接中的实现不充分
使用信号量,代码将按预期运行。您将包括哪些库?事件基本上只是一个布尔标志。对已设置的事件调用
SetEvent
是不可操作的。只要让您的工作线程处理所有队列项目,直到队列醒来时为空。如果您没有忽略它以简化示例,您可能需要一些保护,一个互斥锁或其他什么,围绕队列。@Arash Mohammadi-Win32/stl这一切都取决于您的实现,您的问题还不够清楚。你的信号系统是如何工作的?您是否存储了工作人员每次完成当前任务时都可以检查的事件队列?感谢您指出了真正的问题。下面的链接也帮助我解决了生产者和消费者的问题。