【发布时间】:2015-08-18 16:07:42
【问题描述】:
我有一个关于使用 pthread 条件变量的问题。作为一般用例是这样的
//thread 1:
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);
do_something()
pthread_mutex_unlock(&mutex);
//thread 2:
pthread_cond_signal(&cond);
现在我知道 pthead_cond_wait 将解锁互斥锁并进入睡眠状态,当唤醒时它将锁定互斥锁,然后从调用中返回,但是如何确保线程 2 的信号在线程 1 处于等待状态后到达线程 1。可能会出现线程 2 先运行,然后线程 1 导致丢失唤醒的情况。
如果我再次在线程 2 中使用互斥锁,那么线程 2 也可能会获得锁,它会发出信号并且线程 1 仍在尝试获取锁。这将再次导致失去唤醒。
如何确保来自条件变量的信号到达正在等待的线程?
谢谢
【问题讨论】:
-
您可以通过不使用条件变量作为谓词来确保这一点。它们用于表示某些谓词中的更改;不是谓词本身。 read this 虽然关系模糊,但它在如何使用 cvar、互斥锁和谓词更改方面有一些微不足道但很重要的方面。