使用pthread互斥锁和条件变量

3
我需要寻求帮助的问题写在第七点。在此之前,我会描述我的代码结构。
  1. From main(), two threads thread1 and thread2 are created and initialized to two functions fun1() and fun2() respectively.
  2. I have a mutex named lock_mutex and condition variables named cond1, cond2, cond3 and cond4.
  3. I have global boolean variables var1, var2, var3 and var4 all initialized to false.
  4. fun1() is like the following:

    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() is as following:

    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. There are functions in my code which hold lock_mutex, do some work and signal cond1 and cond2 when appropriate, like this (each is a separate function):

函数 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重复触发。我希望每次它们被触发时都能调用函数C和函数D。

但是,fun1()fun2() 只在第一次唤醒时被唤醒。之后,它们进入 while 循环,获取锁并无限期等待信号,尽管已经发出信号但不会被唤醒。

我无法理解这个问题的原因,并将非常感谢任何建议。如果有关于此类程序的好的调试技术/工具,请也指引给我。

提前致以感谢。

3个回答

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

0

向条件变量发信号并不意味着阻塞线程会立即获得锁并开始运行,而是意味着它被唤醒,当调度程序希望时,它将为阻塞线程分配CPU时间。

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

  • 函数B 信号 cond2
  • fun2 被唤醒,将 var4 设置为 true,信号 cond4,将 var2 设置为 false,释放互斥锁。
  • fun2 重新获取互斥锁,并重新释放它,在 cond2 上等待 var2 变为 true。
  • 函数B 获取互斥锁,将 var2 设置为 true,信号 cond2
  • fun2 被唤醒,将 var4 设置为 true,信号 cond4,将 var2 设置为 false,释放互斥锁。
  • 现在将两个 cond4 的信号合并为一个。

0

听起来像是死锁。

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


我建议查看http://publib.boulder.ibm.com/iseries/v5r1/ic2924/index.htm?info/apis/users_76.htm,他们使用一系列printf语句来跟踪代码的流程,也许这种方法可以阐明正在发生的事情。 - Mr. Graves

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接