我正在寻求帮助的问题写在第 1 点。 7. 在此之前,我描述一下我的代码的结构。
main()
,创建两个线程thread1和thread2并初始化为两个函数fun1()
和 fun2()
分别。 lock_mutex
的互斥锁和名为 cond1
的条件变量, cond2
, cond3
和 cond4.
var1
, var2
, var3
和 var4
全部初始化为假。 fun1()
如下所示:void fun1(){
while(1){
pthread_mutex_lock(&lock_mutex);
while(var1 is false)
pthread_cond_wait(&cond1,&lock_mutex);
//do some work
set var3 = true;
pthread_cond_signal(&cond3);
set var1=false;
pthread_mutex_unlock(&lock_mutex);
}
}
fun2()
如下:void fun2(){
while(1){
pthread_mutex_lock(&lock_mutex);
while(var2 is false)
pthread_cond_wait(&cond2,&lock_mutex);
//do some work
set var4 = true;
pthread_cond_signal(&cond4);
set var2=false;
pthread_mutex_unlock(&lock_mutex);
}
}
lock_mutex
,做一些工作并发出信号cond1
和 cond2
在适当的时候,像这样(每个都是一个单独的函数):功能一:
pthread_mutex_lock(&lock_mutex);
//do some work
set var1= true;
pthread_cond_signal(&cond1);
pthread_mutex_unlock(&lock_mutex);
功能 B:
pthread_mutex_lock(&lock_mutex);
//do some work
set var2= true;
pthread_cond_signal(&cond2);
pthread_mutex_unlock(&lock_mutex);
功能 C:
pthread_mutex_lock(&lock_mutex)
//do some work
while(var3 is false)
pthread_cond_wait(&cond3,&lock_mutex);
//do more work
set var3=false;
pthread_mutex_unlock(&lock_mutex);
功能 D:
pthread_mutex_lock(&lock_mutex)
//do some work
while(var4 is false)
pthread_cond_wait(&cond4,&lock_mutex);
//do more work
set var4= false;
pthread_mutex_unlock(&lock_mutex);
7.
fun1()
和 fun2()
由函数 A 和函数 B 重复发出信号。我预计 fun1()
和 fun2()
每次发出信号时调用函数 C 和函数 D。但是
fun1()
和 fun2()
只是第一次被唤醒。之后,它们进入while循环,获取锁并无限期地等待信号,尽管有信号也不会唤醒。我无法理解这个问题的原因,非常感谢任何建议。如果有任何适用于此类程序的好的调试技术/工具,请也向我介绍。
提前非常感谢。
最佳答案
Graves 先生的问题的答案是 pthread_cond_wait 在阻塞时自动解锁互斥锁。
关于c - 使用 pthreads 互斥量和条件变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3073764/