Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从主线程向workerthread发送信号时出现问题_C++_Multithreading_Synchronization - Fatal编程技术网

C++ 从主线程向workerthread发送信号时出现问题

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

我必须对输入文件(1…N)执行操作A,然后我必须对已完成的文件执行操作B

因此,在主线程中,我迭代了每个文件(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发出信号。 当操作B正在进行时,许多SetEvents正在从主线程触发。因此,下一个WaitforSingleObject()应该在没有任何延迟的情况下发出信号,因为第二个SetEvent已经触发。但这并不像预期的那样有效

  • SetEvent
    • WaitforSingleObject
  • SetEvent
  • SetEvent
  • SetEvent
    • WaitforSingleObject
  • SetEvent
  • SetEvent
    • WaitforSingleObject
我为6个文件调用了6 setevent。但WaitforSingleObject只发出了3的信号


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

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

检查此链接

您的代码在链接中的实现不充分


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

您将包括哪些库?事件基本上只是一个布尔标志。对已设置的事件调用
SetEvent
是不可操作的。只要让您的工作线程处理所有队列项目,直到队列醒来时为空。如果您没有忽略它以简化示例,您可能需要一些保护,一个互斥锁或其他什么,围绕队列。@Arash Mohammadi-Win32/stl这一切都取决于您的实现,您的问题还不够清楚。你的信号系统是如何工作的?您是否存储了工作人员每次完成当前任务时都可以检查的事件队列?感谢您指出了真正的问题。下面的链接也帮助我解决了生产者和消费者的问题。