gpt4 book ai didi

c - 为什么 pthread_cond_signal 有时不起作用?

转载 作者:太空宇宙 更新时间:2023-11-04 01:28:33 25 4
gpt4 key购买 nike

我的程序使用 pthread_cond_waitpthread_cond_signal 执行“线程同步”。它似乎大约有 20 次失败。

我有一个初始化为 0 的共享变量 count。一个线程递增 count 直到 count 为 20 ,然后向条件变量发出信号。

代码如下。

void* inc_count(void *parm)
{
int i;
for(i = 0 ; i <25; i ++)// adds count to 25
{
pthread_mutex_lock(&mutex1);
count ++;
printf("Thread %lld , count = %d\n",(long long int)pthread_self(),count);
if(count == 20)
{
pthread_cond_signal(&cond);
printf("Thread %lld sends a signal!\n",(long long int)pthread_self());
}
pthread_mutex_unlock(&mutex1);
}
pthread_exit(NULL);
}

void* watch_count(void *parm)
{

while(count < 20)
{
pthread_mutex_lock(&mutex1);
pthread_cond_wait(&cond,&mutex1);
printf("Thread %lld receives the signal!\n",(long long int)pthread_self());
}
pthread_mutex_unlock(&mutex1);
pthread_exit(NULL);
}
int main()
{
pthread_t pt1,pt2,pt3,pt4;
pthread_mutex_init(&mutex1,NULL);
pthread_mutex_init(&mutex2,NULL);
pthread_cond_init(&cond,NULL);
pthread_create(&pt1,NULL,inc_count,NULL);
pthread_create(&pt2,NULL,watch_count,NULL);
pthread_join(pt1,NULL);
pthread_join(pt2,NULL);

}

从图中可以看出线程pt2没有收到信号,为什么?

最佳答案

你的 watch_count()功能有问题:

  • 您将互斥体锁定在 while 中循环并仅在其外部解锁(可以尝试多次锁定而不解锁)
  • 检查 count < 20 时没有持有互斥锁

要修复它,您需要在循环之前而不是在循环内部锁定互斥量:

pthread_mutex_lock(&mutex1);    
while(count < 20)
{
pthread_cond_wait(&cond,&mutex1);
printf("Thread %lld receives the signal!\n",(long long int)pthread_self());
}
pthread_mutex_unlock(&mutex1);

这将防止您在解锁前多次锁定互斥锁,并确保 countwhile中的测试之间无法修改和发送信号条件和 pthread_cond_wait ( inc_count() 更改为 count 并且发送信号必须发生在 while 循环之前或 pthread_cond_wait() 期间)。

即使进行了这些更改,如果count,仍然有可能根本不会发生等待。到时候已经20了watch_count()不过,检查一下。

关于c - 为什么 pthread_cond_signal 有时不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27191641/

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