作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我必须对输入文件(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 已经被触发。但这并没有按预期工作。
我为 6 个文件调用了 6 个 setevent。但是 WaitforSingleObject 仅在 3 时发出信号。
首先请让我知道我是否为上下文使用了正确的同步机制?
最佳答案
这是生产者-消费者问题,你可以用信号量来解决。
检查此链接 https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem
您的代码在链接中的实现不充分。
使用信号量,代码将按预期运行。
关于c++ - 从主线程向工作线程发送信号时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47322155/
我是一名优秀的程序员,十分优秀!