gpt4 book ai didi

c - 没有互斥量的 pthread_cond_wait 的潜在缺陷

转载 作者:太空宇宙 更新时间:2023-11-04 04:46:58 26 4
gpt4 key购买 nike

在以下链接中: 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);
}

“不会起作用,在唤醒和获取互斥量之间仍有可能出现竞争条件。”

我不明白唤醒和获取互斥锁之间的竞争条件是如何产生的?

最佳答案

事实上,该示例并未显示问题,但作为一般原则,当有两条指令时,存在竞争条件

这里有一个例子,希望能说明这个问题。

假设您自己管理互斥量并且您有两个线程,thread#1thread#2:

  • thread#1 需要修改一些共享状态
  • 它获取互斥体并改变状态
  • 它释放互斥量并在继续之前等待某些事情发生

这是一些代码:

    pthread_mutex_lock(&mutex);
// change state
pthread_mutex_unlock(&mutex);
pthread_cond_wait(&cond);

还有更多:

  • thread#2 等待互斥锁,更改共享状态并使用条件变量向 thread#1 发出信号以提供 thread#1在继续之前做某事的机会

代码如下:

    pthread_mutex_lock(&mutex);
// change state
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&cond);

这是一个令人讨厌的场景:

  • thread#1 获取锁并更改共享状态
  • thread#1 释放锁,pthread_mutex_unlock(&mutex),并且被抢占
  • thread#2 获取锁,pthread_mutex_lock(&mutex),更改状态,解锁,发出信号并被抢占
  • thread#1 被再次调度并等待条件,pthread_cond_wait(&cond)

您有一个可以升级的问题:

  • 信号已丢失:根据您的应用,它本身可能或多或少很重要
  • 但即使信号本身并不重要,thread#1 现在也卡住等待已经发生的信号
  • 即使 thread#1 没有做一些重要的事情,如果稍后 thread#2 等待 < em>线程#1

因此,为避免此问题,thread#1 必须在释放锁时立即等待,然后其他线程才有机会发出信号。

恕我直言,解锁/等待转换比需要原子化的唤醒/锁定转换更重要。

我很好奇唤醒/锁定转换绝对需要是原子的......

希望这对您有所帮助。

关于c - 没有互斥量的 pthread_cond_wait 的潜在缺陷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19896600/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com