C++ 同一锁上的多个等待
我对锁定有点困惑。具体来说,这段代码来自维基百科,是关于消费者-生产者问题的C++ 同一锁上的多个等待,c++,multithreading,c++11,C++,Multithreading,C++11,我对锁定有点困惑。具体来说,这段代码来自维基百科,是关于消费者-生产者问题的 如果有多个生产者等待添加到队列中,会发生什么情况?如果使用者使用了队列中的某些作业,并发出通知指示队列未满,则他们都会尝试在队列中推送作业,这将要求queue.push方法是线程安全的。因为它们都可以修改队列,所以此代码可能会中断。我错过什么了吗 是的,您忽略了一个事实,xmutex被锁定,因此一次只有一个制作人可以推送任何内容 当您等待条件_变量时必须向其传递一个锁定的互斥锁,该互斥锁将在等待时解锁。等待调用返回时
如果有多个生产者等待添加到队列中,会发生什么情况?如果使用者使用了队列中的某些作业,并发出通知指示队列未满,则他们都会尝试在队列中推送作业,这将要求queue.push方法是线程安全的。因为它们都可以修改队列,所以此代码可能会中断。我错过什么了吗 是的,您忽略了一个事实,
xmutex
被锁定,因此一次只有一个制作人可以推送任何内容
当您等待条件_变量时
必须向其传递一个锁定的互斥锁,该互斥锁将在等待时解锁。等待调用返回时,互斥锁将被重新锁定
尽管所有生产者都会收到
未满的通知。notify_all()代码>事件,因此所有人都会醒来,他们一次只能重新获取xmutex上的锁。这就是互斥锁的全部意义。是的,您忽略了一个事实,即xmutex
是锁定的,因此一次只有一个生产者可以推送任何内容
当您等待条件_变量时
必须向其传递一个锁定的互斥锁,该互斥锁将在等待时解锁。等待调用返回时,互斥锁将被重新锁定
尽管所有生产者都会收到未满的通知。notify_all()代码>事件,因此所有人都会醒来,他们一次只能重新获取xmutex上的锁。这就是互斥的全部意义。除此之外,通常只有一个生产者。如果已经有许多生产商并行运行,他们也可以承担消费者的工作。生产者/消费者(很少有例外)中的要点是将n个可并行化的任务均匀地分配到m个工作线程或执行核心上。如果需要几个生产者,那么一个信号量将是一个更明智的实现(避免您提到的雷鸣般的从众问题)。如果生产商的数量超过max_products(在本例中为10),则有可能有10个生产商在等待,当它们都被唤醒时,它们都会添加到队列中,尽管队列是线程安全的,但队列中的产品数量可以超过10,这是允许的最大数量。除此之外,你通常只有一个制片人。如果已经有许多生产商并行运行,他们也可以承担消费者的工作。生产者/消费者(很少有例外)中的要点是将n个可并行化的任务均匀地分配到m个工作线程或执行核心上。如果需要几个生产者,那么一个信号量将是一个更明智的实现(避免您提到的雷鸣般的从众问题)。如果生产商的数量超过max_products(在本例中等于10),则有可能有10个生产商在等待,当它们都被唤醒时,它们都会添加到队列中,尽管队列是线程安全的,但队列中的产品数量可以超过10,这是允许的最大值。