Linux条件变量详解

发布时间:2023-05-23

一、条件变量介绍

条件变量是Linux线程同步机制中的一种,通常与互斥锁一起使用。在多线程中,我们常常需要控制某个线程的执行,条件变量就是为了这个目的而存在的。 条件变量是基于互斥锁实现的,互斥锁用于保护共享资源,条件变量用于等待和唤醒线程的执行。

    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;   // 初始化互斥锁
    pthread_cond_t cond = PTHREAD_COND_INITIALIZER;     // 初始化条件变量
    pthread_mutex_lock(&mutex);                         // 上锁
    // 等待条件变量满足,阻塞当前线程
    pthread_cond_wait(&cond, &mutex);
    // 处理业务
    pthread_mutex_unlock(&mutex);                       // 解锁

二、条件变量与互斥锁

条件变量需要和互斥锁搭配使用,以保证同步和线程安全。

三、条件变量的API

1. pthread_cond_init

初始化条件变量,通常在创建条件变量的时候进行初始化。

    int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);

2. pthread_cond_destroy

销毁已经初始化的条件变量。

    int pthread_cond_destroy(pthread_cond_t *cond);

3. pthread_cond_wait

等待条件变量满足,阻塞当前线程。

    int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);

4. pthread_cond_signal

唤醒一个等待条件变量的线程,如果没有等待的线程,这个函数不起作用。

    int pthread_cond_signal(pthread_cond_t *cond);

5. pthread_cond_broadcast

唤醒所有等待条件变量的线程。

    int pthread_cond_broadcast(pthread_cond_t *cond);

四、条件变量的使用方法

使用条件变量,需要遵循以下步骤:

  1. 创建互斥锁和条件变量。
  2. 使用互斥锁保护共享变量。
  3. 检查共享变量的状态,如果共享变量的状态不符合条件,就等待条件变量。
  4. 唤醒等待条件变量的线程。
    pthread_mutex_t mutex;
    pthread_cond_t cond;
    int status = 0;
    void* wait_thread(void* arg)
    {
        pthread_mutex_lock(&mutex);                 // 上锁
        while(status == 0) {                        // 循环检查状态
            pthread_cond_wait(&cond, &mutex);        // 等待条件变量
        }
        pthread_mutex_unlock(&mutex);               // 解锁
        // 处理业务
    }
    void* signal_thread(void* arg)
    {
        pthread_mutex_lock(&mutex);                 // 上锁
        status = 1;                                 // 修改状态
        pthread_cond_signal(&cond);                 // 唤醒等待条件变量的线程
        pthread_mutex_unlock(&mutex);               // 解锁
    }

五、总结

条件变量作为Linux线程同步机制中的重要组成部分之一,可以很好地管理多线程的执行。通过条件变量的使用,可以避免线程执行的重复和冲突,保证程序的线程安全。