我正在寻求一些帮助的问题写在第一点。 7.在此之前,我描述了我的代码的结构。
main()
开始,创建两个线程thread1和thread2,并分别初始化为两个函数fun1()
和fun2()
。lock_mutex
的互斥锁,条件变量名为cond1
,cond2
,cond3
和cond4.
var1
,var2
,var3
和var4
全部初始化为false。 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
,这样(每个都是一个单独的函数):功能A:
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循环,获取锁定并无限期地等待信号,尽管发出信号,也不会醒来。
我无法理解这个问题的原因,并且非常感谢任何建议。如果有适合此类程序的任何好的调试技巧/工具,请将它转介给我。
提前多多感谢。
答案 0 :(得分:1)
Graves先生的问题的答案是pthread_cond_wait会在阻止时自动解锁互斥锁。
答案 1 :(得分:0)
这听起来像是一个僵局。
如果一个线程获取互斥锁,然后等待变量设置, 另一个线程如何获取互斥锁以设置变量?
答案 2 :(得分:0)
发送条件变量并不表示阻塞线程获取锁定并立即开始运行,这意味着它已被唤醒,并且当调度程序希望时,它将为阻塞线程提供CPU时间。
所以,我认为这里发生的是:
function B
信号cond2
。fun2
被唤醒,将var4
设置为true,信号cond4
,将var2
设置为false,释放互斥锁。fun2
重新获取互斥锁,并重新发布,等待cond2
var2
成为真。function B
获取互斥锁,将var2
设置为true,信号cond2
fun2
被唤醒,将var4
设置为true,信号cond4
,将var2
设置为false,释放互斥锁。cond4
的信号已合并为一个。