c - 使用 pthreads 互斥量和条件变量

标签 c pthreads mutex

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

  • 来自 main() ,创建两个线程thread1和thread2并初始化为两个函数fun1()fun2()分别。
  • 我有一个名为 lock_mutex 的互斥锁和名为 cond1 的条件变量, cond2 , cond3cond4.
  • 我有全局 bool 变量 var1 , var2 , var3var4全部初始化为假。
  • 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在适当的时候,像这样(每个都是一个单独的函数):

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

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

    提前非常感谢。

    最佳答案

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

    关于c - 使用 pthreads 互斥量和条件变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3073764/

    相关文章:

    asynchronous - 为什么在使用带有 std::sync::Mutex 的 Tokio 时会出现死锁?

    c - 当内存被一个线程修改并被其他线程读取时,使用 pthread 和互斥锁保护内存的最佳方法是什么?

    c - 回文链表

    c - 如何在C语言中读取/解析输入?常见问题

    c++ - 多类中的多线程

    linux - 在 glibc 的 malloc 中使用 POSIX 信号量

    c - 即使我在父进程中使用 sleep() ,我的子进程也是最后执行的

    mysql - 为什么在 C 结构中分配字段时我会得到垃圾字符?

    c++ - pthreads 不能从 main() 函数访问变量吗?

    c++ - std::mutex 是否足以使所有先前的读写发生在同一线程中的后续读写之前?