【问题标题】:Issue in signaling to a workerthread from main thread从主线程向工作线程发出信号的问题
【发布时间】: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


【解决方案1】:

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

查看此链接https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
相关资源
最近更新 更多