pthread_cond_broadcast如何工作?

时间:2012-06-12 15:57:01

标签: c++ c linux pthreads

假设广播线程在广播线程完成广播之后只有3个线程正在等待并且第4个线程调用pthread_cond_wait,第4个线程将退出等待状态。如何重置条件变量,以便广播线程有时可以稍后重新广播到等待的线程。

2 个答案:

答案 0 :(得分:2)

  

第四个线程是否会退出等待状态

不,直到有另一个广播或信号。

  

条件变量如何重置,以便广播   线程有时可以稍后转发给等待的线程。

最简单的想象条件变量所做的一切都是在与条件变量关联的互斥锁下同步的。因此,当你播放时,等待的一切(以某种方式)进入一个试图唤醒并使用互斥锁的状态。然后,广播线程释放互斥锁。因此,当你进行广播时,它不是“复位”的条件变量,它是从等待条件变量移动到等待互斥锁的前三个线程。

为了等待condvar,你的第四个线程必须首先获取互斥锁。这可能发生在前三个线程设法唤醒并使用互斥锁之前或之后,但是在广播之后它明显发生,所以你的第四个线程没有处于“试图唤醒”状态,它在“等待信号或广播”状态。

实际上它比那更复杂 - 你实际上并没有拥有来保存互斥锁以便广播一个条件变量。因此条件变量必须包含一些额外的内部同步(我不知道linux上的具体细节),以确保在广播之前等待的所有线程都将其状态更改为单个操作。

通常情况下你也可以把互斥锁放到广播中,因为当你刚刚改变了服务员想要看到的内容时你会广播,而且无论从多个线程看到什么东西,都会使用互斥锁进行同步。还有一些尴尬的情况,你可以通过这样做来避免。

答案 1 :(得分:1)

  

第四个线程是否会退出等待状态。

不,除非在线程4等待时发出信号通知

手册页explains

  

pthread_cond_broadcast()调用取消阻止当前在指定条件变量cond上阻止的所有线程

     

如果pthread_cond_signal()上当前没有线程被阻止,则pthread_cond_broadcast()cond功能无效。