第二个线程不会从cond_wait唤醒

时间:2016-06-25 12:28:06

标签: c multithreading pthreads posix

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

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

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

因此我们使用来自打印机线程的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));

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

delete

之后计算线程进行计算并等待每个线程在设置字段之前完成 - >印刷回假。

我们觉得我们仍然不太了解如何正确使用互斥锁。

1 个答案:

答案 0 :(得分:1)

pthread_cond_signal()正好表示等待所有线程中的一个。

来自Linux的pthread_cond_signal文档:

  

pthread_cond_signal 重新启动正在等待条件变量cond的其中一个线程。

通知所有等待使用pthread_cond_broadcast的线程。

来自Linux的pthread_cond_broadcast文档:

  

pthread_cond_broadcast 重新启动等待条件变量cond的所有线程。

POSIX documentations说:

  

pthread_cond_broadcast()函数将取消阻止当前在指定条件变量cond上阻塞的所有线程。

     

pthread_cond_signal()函数将取消阻止在指定条件变量cond上阻塞的至少一个线程(如果在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));

最后接受以下建议:在您的真实代码中添加错误检查 * all 那些pthread_*()来电!

而^ 2你确实确保病情和互斥量得到了适当的治疗,不是吗? ; - )