我对锁定感到有点困惑。具体来说,此代码来自维基百科,关于消费者生产者问题。
http://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem#Example_in_C.2B.2B
如果有超过1个生产者等待添加到队列,会发生什么?如果消费者从队列中消耗了一些作业并发出通知来指示队列未满,那么他们都会尝试在队列中推送一个作业,这需要queue.push方法是线程安全的。由于它们都可以修改队列,因此该代码可能会中断。我错过了什么吗?
答案 0 :(得分:4)
是的,您错过了xmutex
被锁定的事实,因此一次只有一个制作人可以推送任何内容。
当您在condition_variable
上等待时,您必须将锁定的互斥锁传递给它,该互斥锁将在等待时解锁。当等待调用返回时,互斥锁将被重新锁定。
虽然所有制作人都会收到is_not_full.notify_all();
事件的通知,但所有人都会被唤醒,但他们只能一次重新获得xmutex
的锁定。这就是互斥体的重点。