【发布时间】:2016-11-13 06:10:19
【问题描述】:
这个问题是关于llnl 中的 pthread 教程。 假设有三个线程。
线程 1:
pthread_mutex_lock(&mutex)
do_something...
if condition
pthread_cond_signal(&con)
pthread_mutex_unlock(&mutex)
repeat
线程 2:
pthread_mutex_lock(&mutex)
do_something...
if condition
pthread_cond_signal(&con)
pthread_mutex_unlock(&mutex)
repeat
线程 3:
pthread_mutex_lock(&mutex)
while(condition not holds)
pthread_cond_wait(&con)
do_something...
pthread_mutex_unlock(&mutex)
假设 Thread1 检查条件是否满足,然后发送信号唤醒 Thread3。最后它解锁了互斥锁。但与此同时,线程 2 正在尝试锁定互斥体。
我的问题是:是否可以保证 Thread3 将永远在比赛中获胜?
如果不是,那么在 Thread2 do_something... 之后,条件变量可能会改变,那么当 Thread3 锁定互斥体时,条件变量与什么不同它期望。
【问题讨论】:
-
没有这样的保证。如果它发生了 10 次中的 10 次,那还是完全不走运。
-
没有这样的保证。这正是为什么您需要围绕
pthread_cond_wait的while 循环!出于同样的原因,您不应该在该 while 循环中包含do_something...。
标签: c++ c multithreading pthreads