首页 文章

使用pthreads互斥和条件变量

提问于
浏览
3

我正在寻求一些帮助的问题写在点号 . 在此之前,我描述了我的代码的结构 .

  • main() ,创建两个线程thread1和thread2,并分别初始化为两个函数 fun1()fun2() .

  • 我有一个名为 lock_mutex 的互斥锁和名为 cond1cond2cond3cond4. 的条件变量

  • 我有全局布尔变量 var1var2var3var4 全部初始化为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 ,做一些工作并在适当的时候发出 cond1cond2 信号,这样(每个都是一个单独的函数):

功能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);
  1. fun1()fun2() 由功能A和功能B重复发出信号 . 我希望 fun1()fun2() 在每次发信号时调用功能C和功能D.

fun1()fun2() 只是第一次被唤醒 . 之后,他们进入while循环,获取锁定并无限期地等待信号,尽管发出信号,也不会唤醒 .

我无法理解这个问题的原因,并且非常感谢任何建议 . 如果有适合此类程序的任何好的调试技巧/工具,请将它也引用给我 .

非常感谢提前 .

3 回答

  • 0

    这听起来像是一个僵局 .

    如果一个线程获取互斥锁然后等待变量设置,另一个线程如何获取互斥锁来设置变量?

  • 0

    Graves先生的问题的答案是pthread_cond_wait会在阻塞时自动解锁互斥锁 .

  • 1

    发送条件变量并不意味着阻塞线程获取锁定并立即开始运行,这意味着它被唤醒,并且当调度程序希望时,它将为阻塞线程提供CPU时间 .

    那么,我认为这里发生的是以下内容:

    • function B signals cond2 .

    • fun2 被唤醒,将 var4 设置为true,信号 cond4 ,将 var2 设置为false,释放互斥锁 .

    • fun2 重新获取互斥锁,并重新发布它,等待 cond2 var2 变为真 .

    • function B 获取互斥锁,将 var2 设置为true,信号 cond2

    • fun2 被唤醒,将 var4 设置为true,信号 cond4 ,将 var2 设置为false,释放互斥锁 .

    • 现在 cond4 的两个信号已合并为一个 .

相关问题