我正在使用POSIX,我有3个线程。
请注意下面的所有线程都使用相同的互斥锁。
线程1正在使用pthread_cond_wait等待要满足的条件(等待在while循环内,所以它也不是无条件的等待)。当满足条件时,线程2将发出一个pthread_cond_broadcast。线程3使用互斥锁,但不等待条件变量。
因此,线程1等待信号/广播,线程3等待互斥锁(这个线程只是等待获取互斥锁)。现在,如果线程2发送一个广播,线程3以某种方式获取互斥,而不是线程1。为什么会发生这种情况?我使用Debian8.3使用glibc2.19。广播不应该唤醒等待条件变量的线程吗?
发布于 2016-05-10 10:23:07
我假设你的互斥锁在线程2中(否则你的问题就没有意义了)。因此,当您调用pthread_cond_broadcast时,它只是卸载等待条件变量的线程。没有执行转移发生。
然后,您解除阻塞互斥锁,并期望等待的线程应该被调度。但是,这种期望是错误的,因为需要由调度程序来决定下一个线程的调度,而且您还可以解除thread 3的阻塞,因为互斥锁不再被锁定。因此,要由调度程序来决定接下来将运行哪一个(1或3)。在这种情况下,没有什么能约束它。
https://stackoverflow.com/questions/37135346
复制相似问题