使用pthreads互斥和条件变量

时间:2010-06-18 23:59:17

标签: c pthreads mutex

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

  1. main()开始,创建两个线程thread1和thread2,并分别初始化为两个函数fun1()fun2()
  2. 我有一个名为lock_mutex的互斥锁,条件变量名为cond1cond2cond3cond4.
  3. 我将全局布尔变量var1var2var3var4全部初始化为false。
  4. 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);
    }
    }
    
  5. 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);
    }
    }
    
  6. 我的代码中有一些函数包含lock_mutex,在适当的时候执行一些工作并发出信号cond1cond2,这样(每个都是一个单独的函数):
  7. 功能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循环,获取锁定并无限期地等待信号,尽管发出信号,也不会醒来。

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

    提前多多感谢。

3 个答案:

答案 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的信号已合并为一个。