我正在寻求一些帮助的问题写在点号 . 在此之前,我描述了我的代码的结构 .
-
从
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);
fun1()
和fun2()
由功能A和功能B重复发出信号 . 我希望fun1()
和fun2()
在每次发信号时调用功能C和功能D.
但 fun1()
和 fun2()
只是第一次被唤醒 . 之后,他们进入while循环,获取锁定并无限期地等待信号,尽管发出信号,也不会唤醒 .
我无法理解这个问题的原因,并且非常感谢任何建议 . 如果有适合此类程序的任何好的调试技巧/工具,请将它也引用给我 .
非常感谢提前 .
3 回答
这听起来像是一个僵局 .
如果一个线程获取互斥锁然后等待变量设置,另一个线程如何获取互斥锁来设置变量?
Graves先生的问题的答案是pthread_cond_wait会在阻塞时自动解锁互斥锁 .
发送条件变量并不意味着阻塞线程获取锁定并立即开始运行,这意味着它被唤醒,并且当调度程序希望时,它将为阻塞线程提供CPU时间 .
那么,我认为这里发生的是以下内容:
function B
signalscond2
.fun2
被唤醒,将var4
设置为true,信号cond4
,将var2
设置为false,释放互斥锁 .fun2
重新获取互斥锁,并重新发布它,等待cond2
var2
变为真 .function B
获取互斥锁,将var2
设置为true,信号cond2
fun2
被唤醒,将var4
设置为true,信号cond4
,将var2
设置为false,释放互斥锁 .现在
cond4
的两个信号已合并为一个 .