【问题标题】:Using pthreads mutex and condition variables使用 pthreads 互斥量和条件变量
【发布时间】:2011-03-05 15:56:44
【问题描述】:

我正在寻求帮助的问题写在第 1 点。 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 的信号,就像这样(每个都是一个单独的函数):

功能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循环,获取锁并无限期等待信号,尽管有信号也不会唤醒。

我无法理解此问题的原因,非常感谢任何建议。如果有针对此类程序的任何好的调试技术/工具,也请向我介绍。

在此先感谢您。

【问题讨论】:

    标签: c pthreads mutex


    【解决方案1】:

    这听起来像是一个僵局。

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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      发信号通知条件变量并不意味着阻塞线程获得了锁并立即开始运行,它意味着它被唤醒了,当调度程序希望时,它会给阻塞线程CPU时间。

      所以,我认为这里发生的情况如下:

      • function B 信号 cond2
      • fun2 被唤醒,将 var4 设置为 true,发出信号 cond4,将 var2 设置为 false,释放互斥体。
      • fun2 重新获取互斥体并重新释放它,等待 cond2 以使 var2 变为 true。
      • function B 获取互斥体,将 var2 设置为 true,发出信号 cond2
      • fun2 被唤醒,设置var4 为真,信号cond4,设置var2 为假,释放互斥体。
      • 现在cond4 的两个信号已合并为一个。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-05
        • 1970-01-01
        • 2015-10-18
        • 2023-03-10
        • 1970-01-01
        相关资源
        最近更新 更多