pthread_cond_wait() 有可能消耗多个 pthread_cond_signal() 吗?

Is possible that a pthread_cond_wait() consumes multiple pthread_cond_signal()?

我在一些环境中测试了这个场景,得到了以下流程:

但是,从手册页 (http://linux.die.net/man/3/pthread_cond_wait ) or ( http://linux.die.net/man/3/pthread_cond_signal) 中,我无法保证不会发生以下情况:

哪个线程执行 signal 可以 运行 在任何 waiting 线程有机会 运行. (安排可能性)

[现在,我知道如果这是用信号量完成的,第二种情况就永远不会发生......但是在我的情况下我真的需要用 cond-vars 来做到这一点!]

在我的例子中,每个 post 都会递增谓词,因此当等待的 Thread2 唤醒时,它将检查谓词(在本例中递增 2),使线程不再休眠并且它会将谓词减 1(意味着消耗了一个 post)。

如果这种情况发生,这意味着 "Thread1" 可能不会醒来,直到进一步的 post 发生,尽管谓词增加了两次 (post) 并减少了只有一次(Thread2 wait)。 更糟,第 3 次等待可能永远不会阻塞,因为它会消耗先前未决的谓词增量。

我还不能触发这个问题,但有人知道这是否可能发生吗?


注意 为了克服这种可能性,我用 pthread_cond_broadcast() 替换了 pthread_cond_signal() 所以 Thread1Thread2保证唤醒并消耗 2 个增量。但是,此解决方案会稍微降低(甚至可能不会显着)性能,而且我敢打赌,对于我们在这里使用广播的原因,任何人都不会明白。

不行,一个pthread_cond_wait()不可能消耗两个信号。

pthread_cond_signal()保证至少唤醒一个当前正在等待条件变量的线程。一旦线程收到信号,它就不再等待条件变量(尽管它可能仍在等待关联的互斥锁),因此后续的 pthread_cond_signal() 必须唤醒 different 等待线程(如果有的话)。

(在您的第二张图中,第二个信号必须以 Thread2 以外的线程为目标,因为此时 Thread2 不再等待条件变量。

POSIX spec for pthread_cond_signal中的确切措辞是:

The pthread_cond_signal() function shall unblock at least one of the threads that are blocked on the specified condition variable cond (if any threads are blocked on cond).