gpt4 book ai didi

c - Linux 中的线程同步?

转载 作者:行者123 更新时间:2023-11-30 18:34:23 25 4
gpt4 key购买 nike

我正在编写一个代码,其中我让我的线程等待,直到我执行 pthread_cond_broadcast。我在这段代码中有三个线程。线程 line2_thread 和 line3_thread 按照其优先级顺序运行,就像它们应该运行的那样。然而,我的第三个线程甚至没有进入它的线程函数(line4_thread)。谁能告诉我为什么我的 main() 无法调用我的 line4_thread ? pthread_cond_t sstart; pthread_mutex_t sstart_mutex;

void *l3_thread(void *arg){

pthread_mutex_lock(&sstart_mutex);
pthread_cond_wait(&sstart, &sstart_mutex);
pthread_mutex_unlock(&sstart_mutex);
/*do something*/

pthread_exit(NULL);

}

void *l2_thread(void *arg){

pthread_mutex_lock(&sstart_mutex);
pthread_cond_wait(&sstart, &sstart_mutex);
pthread_mutex_unlock(&sstart_mutex);
/*do something*/

pthread_exit(NULL);

}


void *l4_thread(void *arg){

pthread_mutex_lock(&sstart_mutex);
pthread_cond_wait(&sstart, &sstart_mutex);
pthread_mutex_unlock(&sstart_mutex);
/*do something*/

pthread_exit(NULL);

}

int main(){

pthread_cond_init(&sstart, NULL);

//thread creation

pthread_cond_broadcast(&sstart);
pthread_cond_destroy(&sstart);
pthread_mutex_destroy(&sstart_mutex);

return 0;
}

最佳答案

我认为您在这里遇到了一些问题。抱歉(我在手机上,所以很难输入很长的答案),我只想专注于几件事,因为我并不是 100% 清楚您实际上想要做什么。

当所有线程启动时,它们都会尝试获取互斥锁,但只有一个成功。可能是l3,但我认为这不能保证。然后,它调用 pthread_cond_wait 并解锁互斥体,允许其他线程之一到达其 pthread_cond_wait。但与此同时。您已允许主线程调用 pthread_cond_broadcast,并且未采取任何措施将其与其他线程同步。它可能发生在其他人因等待互斥体而解除阻塞之前,以及在他们的 wait 调用之前,因此他们可能会错过信号并永远阻塞。

此外,我认为立即调用pthread_cond_destroy有点粗略。就像我说的,主线程和工作线程之间没有同步,因此您可能可以调用 pthread_cond_broadcast ,然后调用 pthread_cond_destroy,因此您的某些线程可能会调用 pthread_cond_wait 无效条件变量和死锁。

检查pthread_cond_wait的返回值。如果我是对的,在某些情况下它可能会返回 EINVAL 。但我还没有测试过这个,所以我的推理可能有缺陷。

关于c - Linux 中的线程同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52350319/

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