gpt4 book ai didi

c - pthread_cond_signal 阻塞线程

转载 作者:行者123 更新时间:2023-12-04 23:21:58 24 4
gpt4 key购买 nike

我有以下代码为 N 个线程运行,计数 = 0 最初作为共享变量。每个变量都在线程工作之前初始化。我正在尝试仅为 MAX 线程数执行代码的关键部分。

void *tmain(){
while(1){
pthread_mutex_lock(&count_mutex);
count++;
if(count>MAX){
pthread_cond_wait(&count_threshold_cv, &count_mutex);
}
pthread_mutex_unlock(&count_mutex);
/*
some code not associated with count_mutex or count_threshold_cv
*/
pthread_mutex_lock(&count_mutex);
count--;
pthread_cond_signal(&count_threshold_cv);
pthread_mutex_unlock(&count_mutex);
}
}

但是在运行一段时间后,线程在 pthread_cond_signal() 处被阻塞。我无法理解为什么会发生这种情况。任何帮助表示赞赏。

最佳答案

这段代码有一个弱点,可能会导致阻塞问题。
更准确地说,它不受所谓的 的保护。虚假唤醒 ,
这意味着 pthread_cond_wait() 函数可能会在未传递信号时返回 明确通过调用 pthread_cond_signal() 或 pthread_cond_broadcast()。
因此,代码中的以下几行不保证线程在 时唤醒。计数 变量小于或等于 MAX

if(count>MAX){
pthread_cond_wait(&count_threshold_cv, &count_mutex);
}

让我们看看当计数仍然大于 MAX 时,当一个线程唤醒时会发生什么:
紧接着互斥锁被解锁。
现在其他线程可以进入关键 session 并增加计数变量超过预期:
pthread_mutex_lock(&count_mutex);
count++;

如何保护代码免受虚假信号的影响?
pthread_cond_wait 唤醒是检查谓词 (count>MAX) 的建议。
如果还是false,我们需要继续等待条件变量。
尝试通过更改 来修复您的代码如果 声明 语句(并且,正如@alk 所述,更改 tmain() 签名):
while(count>MAX)
{
pthread_cond_wait(&count_threshold_cv, &count_mutex);
}

现在,如果发生虚假唤醒并且计数仍然大于 MAX,
流程将再次等待条件变量。仅当唤醒伴随着谓词更改时,流才会退出等待循环。

关于c - pthread_cond_signal 阻塞线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23003745/

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