pthread_cond_broadcast 取消阻塞不等待条件变量的线程

pthread_cond_broadcast unblocks a thread not waiting on conditional variable

我正在使用 POSIX 并且我有 3 个线程。

请注意以下所有线程都使用相同的互斥锁。

线程 1 正在使用 pthread_cond_wait 等待满足条件(等待在 while 循环内,因此它也不是无条件等待)。 线程 2 将在满足条件时发出 pthread_cond_broadcast。 线程 3 使用互斥量进行锁定但不等待条件变量。

因此,线程 1 正在等待 signal/broadcast,线程 3 正在等待互斥锁(该线程只是在等待获取互斥锁)。现在,如果线程 2 发送广播,不知何故线程 3 正在获取互斥量而不是线程 1。为什么会发生这种情况?我正在使用 glibc2.19 使用 debian 8.3。 广播不应该唤醒等待条件变量的线程吗?

我假设您在线程 2 中锁定了一个互斥量(否则您的问题就没有意义了)。因此,当您调用 pthread_cond_broadcast 时,它只会解除阻塞等待条件变量的线程。没有执行转移正在发生。

然后您解除对互斥锁的阻塞,并期望应该调度正在等待的线程。但是这种期望是错误的,因为由调度程序决定下一个线程要调度什么,并且由于互斥锁不再被锁定,您还可以解锁线程 3。因此,由调度程序决定下一个 运行 是哪个(1 或 3)。在这种情况下没有任何限制。