在同一把锁上多次等待

Multiple wait on the same lock

本文关键字:等待 一把      更新时间:2023-10-16

我对锁定有点困惑。具体来说,这段代码来自维基百科,关于消费者生产者问题。

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锁。这就是互斥锁的全部意义所在。