我在某些环境中测试了这种情况,我得到了以下流程:
但是,从手册页(http://linux.die.net/man/3/pthread_cond_wait)或(http://linux.die.net/man/3/pthread_cond_signal),我找不到任何保证以下内容场景不可能发生:
哪个是执行信号的 2个线程可以在任何等待线程有机会运行之前运行.(调度可能性)
[现在,我知道如果这是用信号量完成的,那么第二种情况永远不会发生......但在我的情况下,我真的需要用cond-vars来做这件事!]
在我的情况下,每个帖子都会增加谓词,所以当等待的Thread2唤醒时,它将检查谓词(在这种情况下增加2),使线程不再睡眠,它会使谓词减1(意思是那个帖子被消耗了).
如果这种情况发生,则意味着"Thread1"可能不会在发生进一步发布之前唤醒,尽管谓词增加了两次(post)并且仅减少一次(Thread2 等待). 更糟糕的是,第三次等待可能永远不会阻塞,因为它将消耗先前挂起的谓词增量.
我还不能触发这个问题,但是有人知道这是否是一种可能的情况?
注意克服这种可能性,我已经取代了pthread_cond_signal()通过pthread_cond_broadcast()使双方Thread1和Thread2保证醒来,消耗2个增量.然而,这个解决方案会略微降低(甚至可能不会显着)性能,我敢打赌,对于那些为什么我们在这里使用广播的人来说这并不明显.