gpt4 book ai didi

c - 第二个线程没有从 cond_wait 中唤醒

转载 作者:行者123 更新时间:2023-11-30 15:07:42 25 4
gpt4 key购买 nike

我们正在努力为《生命游戏》寻找良好的同步。

因此,我们有一个打印机线程,目前有两个线程来计算接下来要打印的新一代单元格。

如果旧游戏已经打印出来,计算线程只能开始计算新一代游戏。

因此,我们使用打印机线程中的 pthread_cond_signal() 来唤醒两个计算线程。

由于某种原因,只有一个线程在 pthread_cond_wait()

处唤醒

我们已经尝试使用广播代替信号,但这没有任何效果。

这就是我们的打印机线程的作用:

field -> printed = true;
//pthread_mutex_unlock(&(field -> print_mutex));
int status = pthread_cond_signal(&(field -> print_signal));

这就是我们的计算线程所做的事情:

while(!field -> printed){
printf("waiting for print_signal: %d\n", field -> printed);
pthread_mutex_unlock(&(field -> print_mutex));
pthread_cond_wait(&(field -> print_signal), &(field -> print_mutex));
printf("print_signal received: %d\n", field -> printed);
}
printf("print_signal received2: %d\n", field -> printed);
pthread_mutex_unlock(&(field -> print_mutex));

然后,计算线程进行计算并等待每个线程完成,然后再将字段设置为 -> 打印回 false。

我们觉得我们仍然没有真正理解如何正确使用互斥体。

最佳答案

pthread_cond_signal() 恰好发出所有正在等待的线程之一的信号。

来自 Linux 的 pthread_cond_signal 文档:

pthread_cond_signal restarts one of the threads that are waiting on the condition variable cond.

要通知所有正在等待的线程,请使用pthread_cond_broadcast

来自 Linux 的 pthread_cond_broadcast 文档:

pthread_cond_broadcast restarts all the threads that are waiting on the condition variable cond.

POSIX documentations说:

The pthread_cond_broadcast() function shall unblock all threads currently blocked on the specified condition variable cond.

The pthread_cond_signal() function shall unblock at least one of the threads that are blocked on the specified condition variable cond (if any threads are blocked on cond).

<小时/>

您还希望在调用 pthread_cond_wait() 之前锁定互斥锁。当线程进入等待状态时,互斥体就会隐式解锁。

另请注意,在 pthread_cond_wait() 返回后,互斥锁再次被锁定。

要遵循此概念,您可以将代码更改为如下所示:

pthread_mutex_lock(&(field -> print_mutex));

while (!field -> printed)
{
pthread_cond_wait(&(field -> print_signal), &(field -> print_mutex));
}

pthread_mutex_unlock(&(field -> print_mutex));

还要确保在没有保护的情况下写入标志

pthread_mutex_lock(&(field -> print_mutex));

field -> printed = true;
pthread_cond_signal(&(field -> print_signal));

pthread_mutex_unlock(&(field -> print_mutex));
<小时/>

最后采纳这个建议:在您的实际代码中,向*所有这些pthread_*() 调用添加错误检查!

<小时/>

并且^2您确实确保了条件和互斥体已正确初始化,不是吗? ;-)

关于c - 第二个线程没有从 cond_wait 中唤醒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38028529/

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