gpt4 book ai didi

c - 使用线程打印奇数和偶数

转载 作者:太空宇宙 更新时间:2023-11-03 23:48:22 24 4
gpt4 key购买 nike

我知道我的问题有很多例子。但是,我想了解为什么我编写的 1 个程序有效而其他程序无效。

这是我写的。

void * even()
{
while(1)
{
pthread_mutex_lock(&lock);
if(count % 2 == 0)
{
printf("count %d\n",count);
pthread_cond_signal(&cond);
}
else
{
pthread_cond_wait(&cond,&lock);
}
count++;
pthread_mutex_unlock(&lock);

if(count >= 100) return NULL;
}
}


void * odd()
{
while(1)
{
pthread_mutex_lock(&lock);
if(count % 2 == 1)
{
printf("count %d\n",count);
pthread_cond_signal(&cond);
}
else
{
pthread_cond_wait(&cond,&lock);
}
count++;
pthread_mutex_unlock(&lock);

if(count >= 100) return NULL;
}
}

所以上面的代码有时只打印 0 或 0 和 1。但是下面的代码工作正常。

void * even()
{
while(1)
{
pthread_mutex_lock(&lock);
if(count % 2 == 0)
{
printf("count %d\n",count);
count++;
pthread_cond_signal(&cond);
}
else
{
pthread_cond_wait(&cond,&lock);
}
pthread_mutex_unlock(&lock);

if(count >= 100) return NULL;
}
}


void * odd()
{
while(1)
{
pthread_mutex_lock(&lock);
if(count % 2 == 1)
{
printf("count %d\n",count);
count++;
pthread_cond_signal(&cond);
}
else
{
pthread_cond_wait(&cond,&lock);
}
pthread_mutex_unlock(&lock);

if(count >= 100) return NULL;
}
}

非常感谢。

最佳答案

在第一个示例中,可能会发生以下变化:

  1. even() 获取锁
  2. even() 打印 count(为 0)并发出条件信号(尽管 odd() 直到 even() 释放锁)
  3. even()count 递增到 1
  4. even() 释放锁,odd() 唤醒。
  5. odd()count 增加到 2
  6. odd() 释放锁(但没有发出条件信号)
  7. odd() 获取锁
  8. odd() 等待,因为 count 是偶数 (== 2)...现在两个线程都在等待并且都无法发出条件信号。

根据哪个线程先执行,事情可能会略有不同,但两个线程仍然会以与上述类似的方式卡住。

但是,这两个示例都不可靠,因为它们没有考虑等待条件时的虚假唤醒。通常,如果未满足所需的唤醒条件,应使用循环重试等待,并始终保持锁定状态,以免错过信号:

        pthread_mutex_lock(&lock);
/* ...stuff... */
/* Use a loop to restart the wait if it was interrupted early */
while(count % 2 != 0)
pthread_cond_wait(&cond,&lock);
/* ...stuff... */
pthread_mutex_unlock(&lock);

关于c - 使用线程打印奇数和偶数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27216323/

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