在以下链接中: Why do pthreads’ condition variable functions require a mutex?
@nos描述了在没有互斥锁的情况下实现pthread_cond_wait()的潜在漏洞:
while(1) {
pthread_cond_wait(&cond); //imagine cond_wait did not have a mutex
pthread_mutex_lock(&mutex);
char *data = some_data;
some_data = NULL;
pthread_mutex_unlock(&mutex);
handle(data);
}
“不起作用,在唤醒和抓住互斥锁之间仍有可能出现竞争条件。”
我不明白如何在唤醒和获取互斥锁之间出现竞争条件?
答案 0 :(得分:0)
事实上,这个例子并未显示问题,但作为一般原则,当有两条指令时,竞争条件就会存在。
这是一个有希望说明问题的例子。
假设您自己管理互斥锁,并且您有两个线程,线程#1 和线程#2 :
以下是一些代码:
pthread_mutex_lock(&mutex);
// change state
pthread_mutex_unlock(&mutex);
pthread_cond_wait(&cond);
还有更多:
以下是代码:
pthread_mutex_lock(&mutex);
// change state
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&cond);
这是一个讨厌的场景:
pthread_mutex_unlock(&mutex)
,被抢先 pthread_mutex_lock(&mutex)
,更改状态,解锁,信号并抢占 pthread_cond_wait(&cond)
您有一个问题可以升级:
为了避免这个问题,线程#1 必须在任何其他线程有机会发出信号之前释放锁定时立即等待。
恕我直言,解锁/等待转换比唤醒/锁定转换更需要原子。
我很想知道唤醒/锁定转换绝对需要是原子的场景......
希望这有帮助。