Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 同一锁上的多个等待_C++_Multithreading_C++11 - Fatal编程技术网

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,这是允许的最大值。