我是靠谱客的博主 称心含羞草,最近开发中收集的这篇文章主要介绍条件变量,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

三、条件变量。
1、 什么是条件变量?
线程因为某一个条件/情况不成立下,进入一个变量中等待,这个存放线程的变量就是条件变量。
条件变量一定要与互斥锁连用。

2、条件变量的函数接口。
1)先定义一个条件变量。  -> 数据类型: pthread_cond_t
   pthread_cond_t cond;

2)初始化条件变量。  -> pthread_cond_init()  -> man 3 pthread_cond_init
动态初始化:
头文件:
    #include <pthread.h>

原型:    
    int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);

参数:
    cond: 条件变量的地址。
    cond_attr: 普通属性,填NULL。

返回值:
    成功:0
    失败:非0

静态初始化:
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

3)如何进入条件变量中等待?   ->  pthread_cond_wait()  -> man 3 pthread_cond_wait
头文件:
    #include <pthread.h>

原型:
    int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);

参数:
    cond:条件变量的地址。
    mutex: 互斥锁的地址。  -> 进入条件变量中等待时,会自动解锁。

返回值:
    成功:0
    失败:非0

4)如何唤醒条件变量中等待的线程?  -> 线程离开条件变量时,会自动上锁。
广播:唤醒所有在条件变量中等待的线程。     --> pthread_cond_broadcast()
单播:随机唤醒一个在条件变量中等待的线程。 --> pthread_cond_signal()

头文件:
    #include <pthread.h>

原型:
    int pthread_cond_broadcast(pthread_cond_t *cond);
    int pthread_cond_signal(pthread_cond_t *cond);

参数:
    cond:条件变量的地址。

返回值:
    成功:0
    失败:非0

5)销毁条件变量。  -> pthread_cond_destroy()  -> man 3 pthread_cond_destroy
头文件:
    #include <pthread.h>

原型:
    int pthread_cond_destroy(pthread_cond_t *cond);

参数:
    cond:条件变量的地址。

返回值:
    成功:0
    失败:非0

   练习4: 有5个小孩,每一个小孩任务都是拿200块,首先在银行卡里面存400块,有2个小孩可以拿到钱后退出,3个线程拿不到钱就进去条件变量中睡眠,5S再打400块之后,唤醒所有的小孩起来拿钱,4S再打200块,唤醒一个小孩起来。

#include "head.h"

//初始化互斥锁
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;

//初始化条件变量
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

int sum = 400;

//线程:
void *fun(void *arg)
{
    //1. 每一个线程访问临界资源(银行卡)之前,都必须先上锁。
    pthread_mutex_lock(&m);
    
    //2. 询问条件是否满足?
    while(sum < 200)  //请问余额是不是<200
    {
        //3. 不能拿到钱就进去睡眠。
        pthread_cond_wait(&cond,&m);
    }

    //4. 能拿到钱就扣钱
    printf("before money:%dn",sum);
    sum -= 200;
    printf("after money:%dn",sum);
    
    //5. 解锁
    pthread_mutex_unlock(&m);
    
    //6. 走人
    pthread_exit(NULL);
}

void *func_time(void *arg)
{
    int i;
    for(i=0;i<100;i++)
    {
        printf("i = %dn",i);
        sleep(1);
    }
}

int main(int argc,char *argv[])
{
    //0. 倒数时间线程
    pthread_t tid_time;
    pthread_create(&tid_time,NULL,func_time,NULL);
    
    //1. 由于5个线程任务一样,通过循环去创建线程。
    int i;
    pthread_t tid[5];
    for(i=0;i<5;i++)
    {
        pthread_create(&tid[i],NULL,fun,NULL);
    }
    
    //2. 打400块
    sleep(5);
    pthread_mutex_lock(&m);
    sum += 400;
    printf("main thread + 400!n");
    pthread_mutex_unlock(&m);
    
    //3. 唤醒所有小孩
    sleep(2);
    pthread_cond_broadcast(&cond); //只有2个小孩能拿到钱
    
    //4. 打200块
    sleep(3);
    pthread_mutex_lock(&m);
    sum += 200;
    printf("main thread + 200!n");
    pthread_mutex_unlock(&m);

    //5. 唤醒一个小孩
    sleep(2);
    pthread_cond_signal(&cond);
    
    //6. 接合线程
    for(i=0;i<5;i++)
    {
        pthread_join(tid[i],NULL);
    }
    
    //7. 销毁资源
    pthread_mutex_destroy(&m);
    pthread_cond_destroy(&cond);
    
    return 0;
}


 

最后

以上就是称心含羞草为你收集整理的条件变量的全部内容,希望文章能够帮你解决条件变量所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部