在同一把锁上多次等待
Multiple wait on the same lock
我对锁定有点困惑。具体来说,这段代码来自维基百科,关于消费者生产者问题。
http://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem#Example_in_C.2B.2B
如果有超过 1 个生产者等待添加到队列中,会发生什么情况?如果使用者消耗了队列中的某个作业并发出通知以指示队列未满,则它们都尝试在队列中推送作业,这将要求 queue.push 方法是线程安全的。由于它们都可以修改队列,因此此代码可能会中断。我错过了什么吗?
是的,你错过了xmutex
被锁定的事实,所以一次只有一个生产者可以推送任何东西。
当您等待condition_variable
时,您必须向其传递一个锁定的互斥锁,该互斥锁将在等待时解锁。当等待调用返回时,互斥锁将被重新锁定。
尽管所有生产者都会收到is_not_full.notify_all();
事件的通知,因此所有人都会醒来,但他们一次只能重新获得xmutex
锁。这就是互斥锁的全部意义所在。
相关文章:
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 如何让LLDB在成功时退出,在失败时等待
- 等待整个 omp 块完成,然后再调用第二个函数
- 提升 ASIO - io_service 不要等待连接到线程
- 如何在C++中实现带有packaged_task的异步等待循环?
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- 如何等待窗口隐藏在Qt中?
- 如何在不等待检索的情况下获取C++中的内存位置?
- 等待被迷住了,没有回来
- 等待 WaitForMultipleObjects 窗口中的事件数量可变
- 一个线程等待多个线程事件
- 等待 qthread 终止的正确方法是什么?
- 不可预测的C++睡眠/等待行为
- Bison/flex 在识别规则后等待输入
- 使用记事本C++打开 txt 文件时无需等待
- 接受函数在发送数据包时等待
- 在Visual Studio中运行/调试C ++时,如何在结束时等待输入
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- 在等待时破坏condition_variable
- 如何处理 RAII 中的资源等待