我正在使用POSIX,我有3个线程。
请注意,下面的所有主题都使用相同的互斥锁。
线程1正在使用pthread_cond_wait等待满足条件(等待在while循环内,因此它也不是无条件等待)。 线程2将在满足条件时发出pthread_cond_broadcast。 线程3使用互斥锁进行锁定,但不等待条件变量。
因此,线程1正在等待信号/广播,线程3正在等待互斥锁(此线程正等待获取互斥锁)。现在,如果线程2发送广播,则线程3以某种方式获取互斥体而不是线程1.为什么会发生这种情况?我使用glibc2.19使用debian 8.3。 广播不应该唤醒正在等待条件变量的线程吗?
答案 0 :(得分:1)
我假设您在线程2中锁定了互斥锁(其他方式您的问题没有意义)。所以当你调用pthread_cond_broadcast
时,它只是解锁正在等待条件变量的线程。没有执行转移。
然后取消阻止互斥锁,并期望应该安排正在等待的线程。但是这种期望是错误的,因为调度程序决定下一个要调度的线程是什么,并且还有线程3解除阻塞,因为互斥锁不再被锁定。因此,由调度程序决定下一个将运行哪一个(1或3)。在这种情况下,没有什么限制它。