0

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

http://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem#Example_in_C.2B.2B

如果有超过 1 个生产者等待添加到队列中会发生什么?如果消费者从队列中消费了一些作业并发出通知以指示队列未满,他们都会尝试将作业推送到队列中,这需要 queue.push 方法是线程安全的。由于他们都可以修改队列,因此此代码可能会中断。我错过了什么吗?

4

1 回答 1

4

是的,您错过了xmutex被锁定的事实,因此一次只有一个生产者可以推送任何内容。

当您等待时,condition_variable您必须传递一个锁定的互斥锁,该互斥锁将在等待时解锁。当等待调用返回时,互斥锁将被重新锁定。

尽管所有生产者都会收到该is_not_full.notify_all();事件的通知,因此都会被唤醒,但他们一次只能重新获得一个锁xmutex。这就是互斥锁的全部意义所在。

于 2013-10-09T16:32:02.703 回答