C++ pthread_cond_广播是如何工作的?
假设广播线程在只有3个线程等待时进行广播,第4个线程调用C++ pthread_cond_广播是如何工作的?,c++,c,linux,pthreads,C++,C,Linux,Pthreads,假设广播线程在只有3个线程等待时进行广播,第4个线程调用pthread\u cond\u wait在广播线程完成广播后,第4个线程是否会退出等待状态。以及如何重置条件变量,以便广播线程可以在稍后向等待的线程重播 第四个线程是否会脱离等待状态 不,除非在线程4等待时发出条件变量信号 手册页: pthread\u cond\u broadcast()调用取消阻止指定条件变量cond上当前阻止的所有线程 如果cond上当前没有被阻止的线程,则pthread\u cond\u signal()和pthr
pthread\u cond\u wait
在广播线程完成广播后,第4个线程是否会退出等待状态。以及如何重置条件变量,以便广播线程可以在稍后向等待的线程重播
第四个线程是否会脱离等待状态
不,除非在线程4等待时发出条件变量信号
手册页:
pthread\u cond\u broadcast()
调用取消阻止指定条件变量cond
上当前阻止的所有线程
如果cond
上当前没有被阻止的线程,则pthread\u cond\u signal()和pthread\u cond\u broadcast()
函数无效
第四个线程是否会脱离等待状态
不,除非有另一个广播或信号
如何重置条件变量,使广播
线程有时可以稍后重新广播到等待的线程
最简单的设想是,条件变量所做的一切都在与条件变量关联的互斥锁下同步。因此,在您广播时,所有等待的内容(不知何故)都会进入一种状态,即试图唤醒并获取互斥。然后,广播线程释放互斥锁。因此,当您广播时,不是真正的条件变量被“重置”,而是前三个线程从等待条件变量变为等待互斥
为了等待condvar,第四个线程必须首先获取互斥锁。这可能发生在前三个线程设法唤醒并使用互斥锁之前或之后,但它显然发生在广播之后,因此您的第四个线程没有处于“尝试唤醒”状态,而是处于“等待信号或广播”状态
事实上,它比这更复杂——实际上,广播条件变量不需要持有互斥锁。因此,条件变量必须包含一些额外的内部同步(我不知道linux上的具体细节),以确保在广播之前等待的所有线程作为单个操作更改其状态
不过,通常情况下,您也可以持有互斥对象进行广播,因为您在刚刚更改了服务员希望看到的内容时进行广播,并且从许多线程中查看的内容都是使用互斥对象进行同步的。还有一些尴尬的情况,你可以通过一直这样做来避免