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()
所以 Thread1
和 Thread2
保证唤醒并消耗 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
).
我在一些环境中测试了这个场景,得到了以下流程:
但是,从手册页 (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()
所以 Thread1
和 Thread2
保证唤醒并消耗 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 variablecond
(if any threads are blocked oncond
).