2 回答
TA贡献1835条经验 获得超7个赞
您不初始化互斥量或条件变量。它们具有静态持续时间,因此会参与默认初始化,但是不能保证会产生可用状态。和的通用方法是使用pthread_cond_init()和pthread_mutex_init(),但是如果默认值足够,那么您还可以使用初始化器宏:
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t dadam = PTHREAD_COND_INITIALIZER;
pthread_cond_t dudum = PTHREAD_COND_INITIALIZER;
您也尝试dudum不持有指定的互斥体而等待CV 。调用时,您需要保持互斥量pthread_cond_wait():
pthread_mutex_lock(&mut);
pthread_cond_wait(&dudum, &mut);
(反之亦然)。
但是主要的问题似乎是实现中的竞争条件。
在其循环的每次迭代中,函数都在继续之前first()等待CV dadam,而在其循环的每次迭代时,函数都在继续之前second()等待CV dudum。如果可以引导它,这可能会起作用,但是当您第一次启动这两个功能时,任何一个都不能继续等待,以表示另一个正在等待的CV。您dadam从主线程发出信号,但是如果主线程在first()开始等待之前发送信号,则该信号将丢失。
请注意,pthread_cond_signal()
将目标CV的相关互斥锁锁定时可以执行一段时间。不需要这样做,但有些人建议将其作为一种良好做法。
- 2 回答
- 0 关注
- 373 浏览
添加回答
举报