美文网首页
线程安全之条件变量

线程安全之条件变量

作者: 二进制人类 | 来源:发表于2022-10-06 11:12 被阅读0次

    相关API

    初始化

    #include <pthread.h>
    /**
     * [pthread_cond_init 初始化条件变量]
     * @param  cond [初始化的条件变量指针]
     * @param  attr [要初始化条件变量的属性,使用NULL表示采用默认属性]
     * @return      [成功返回0,失败返回错误号]
     */
    int pthread_cond_init(pthread_cond_t *restrict cond,
               const pthread_condattr_t *restrict attr);
    pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
    

    销毁

    #include <pthread.h>
    /**
     * [pthread_cond_destroy 销毁条件变量]
     * @param  cond [指向需要销毁的条件变量指针]
     * @return      [成功返回0,失败返回错误号]
     */
    int pthread_cond_destroy(pthread_cond_t *cond);
    

    等待条件

    #include <pthread.h>
    /**
     * [pthread_cond_wait 
     * 等待一个条件变量
        1) 阻塞等待条件变量cond满足;
        2) 释放已掌握的互斥锁(解锁互斥量)相当于pthread_mutex_unlock(&mutex);
            1) 2) 两步为一个原子操作。
        3) 当被唤醒,pthread_cond_wait函数返回时,解除阻塞并重新申请获取互斥锁pthread_mutex_lock(&mutex);
     * ]
     * @param  cond  [已经初始化的条件变量]
     * @param  mutex [表示互斥锁]
     * @return       [成功返回0,失败返回错误号]
     */
    int pthread_cond_wait(pthread_cond_t *restrict cond,
               pthread_mutex_t *restrict mutex);
    
    /*
    限时等待,在时间范围内等价于pthread_cond_wait,超过时间范围直接返回。
    abstime绝对时间
     */
    int pthread_cond_timedwait(pthread_cond_t *restrict cond,
               pthread_mutex_t *restrict mutex,
               const struct timespec *restrict abstime);
    

    唤醒

    #include <pthread.h>
    /*
    功能:唤醒至少一个阻塞在条件变量上的线程
    参数:cond已初始化的条件变量
    返回值:成功返回0,失败返回错误号
    */
    int pthread_cond_signal(pthread_cond_t *cond);
    /*
    功能:唤醒所有阻塞在条件变量上的线程 
    */
    int pthread_cond_broadcast(pthread_cond_t *cond);
    

    实例

    #include <stdio.h>
    #include <unistd.h>
    #include <pthread.h>
    
    pthread_mutex_t mutex;      /* 定义互斥锁变量 */
    pthread_cond_t cond;        /* 定义条件变量 */
    char buf[] = "0123456789";
    
    /* 定义数组元素输出子线程执行函数 */
    void * prt_arr(void *arg)
    {
        while(1) {
            /* 加锁 */
            pthread_mutex_lock(&mutex);
            /* 设置等待条件 */
            pthread_cond_wait(&cond, &mutex);   
            printf("%s\n", buf);
            /* 解锁 */
            pthread_mutex_unlock(&mutex);
            //sleep(1);
        }
    }
    
    /* 定义数组元素倒序子线程执行函数 */
    void *reverse_arr(void *arg)
    {
        int i;
        char tmp;
        while(1) {
            /* 加锁 */
            pthread_mutex_lock(&mutex);
            for (i = 0; i < 5; i++) {
                tmp = buf[i];
                buf[i] = buf[9-i];
                buf[9-i] = tmp;
            }
            /* 唤醒阻塞在cond条件下的线程 */
            pthread_cond_signal(&cond);
            /* 解锁 */
            pthread_mutex_unlock(&mutex);
            sleep(1);
        }
    }
    
    int main()
    {
        int ret;
        pthread_t prt_id;
        pthread_t reverse_id;
        /* 初始化互斥锁 */
        pthread_mutex_init(&mutex, NULL);
        /* 初始化添加变量 */
        pthread_cond_init(&cond, NULL);
        /* 生产者线程:倒序 */
        ret = pthread_create(&reverse_id, NULL, reverse_arr, NULL);
        if (ret != 0) {
            fprintf(stderr, "create video pthread fail\n");
            return -1;
        }
        /* 消费者线程:输出数组元素 */
        ret = pthread_create(&prt_id, NULL, prt_arr, NULL);
        if (ret != 0) {
            fprintf(stderr, "create video pthread fail\n");
            return -1;
        }
        while(1) {
            printf("main pthread\n");
            sleep(10);
        }
        /* 销毁添加变量 */
        pthread_cond_destroy(&cond);
        /* 销毁互斥锁 */
        pthread_mutex_destroy(&mutex);
    }
    

    相关文章

      网友评论

          本文标题:线程安全之条件变量

          本文链接:https://www.haomeiwen.com/subject/ezeuartx.html