我们正在努力寻找生命游戏的良好同步。
因此,我们有一个打印机线程,当前有两个线程计算下一个要打印的新一代单元格。
如果已经打印旧游戏,计算线程只能开始计算新一代游戏。
因此我们使用来自打印机线程的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
之后计算线程进行计算并等待每个线程在设置字段之前完成 - >印刷回假。
我们觉得我们仍然不太了解如何正确使用互斥锁。
答案 0 :(得分:1)
pthread_cond_signal()
正好表示等待所有线程中的一个。
来自Linux的pthread_cond_signal
文档:
pthread_cond_signal 重新启动正在等待条件变量cond的其中一个线程。
通知所有等待使用pthread_cond_broadcast
的线程。
来自Linux的pthread_cond_broadcast
文档:
pthread_cond_broadcast 重新启动等待条件变量cond的所有线程。
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你确实确保病情和互斥量得到了适当的治疗,不是吗? ; - )