条件变量的简单使用

条件变量的创建和销毁

#include<pthread.h>

int pthread_cond_init(pthread_cond_t  *cond,pthread_condattr_t  *cond_attr);

int pthread_cond_destroy(pthread_cond_t  *cond);

返回值:成功返回0,出错返回错误编号

参数:

        cond:条件变量

        attr:条件变量属性

条件变量的等待操作

#include<pthread.h>

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

int pthread_cond_timewait(pthread_cond_t  *cond,

                                           pthread_mutex_t  *mutex,

                                           const struct timespec  *abstime(超时时间timeout));

返回值:成功返回0,出错返回错误编号

struct timespec

{

        time_t  tv_sec;   /*seconds*/

        long  tv_nsec;   /*nanoseconds*/

};

参数:

        cond:条件变量

        mutex:互斥锁

互斥锁mutex是对条件变量cond的保护

线程由于调用wait函数阻塞,否则释放互斥锁

条件变量的通知操作

#include<pthread.h>

int pthread_cond_signal(pthread_cond_t  *cond);

int pthread_cond_broadcast(pthread_cond_t  *cond);

返回值:成功返回0,否则返回错误编号

参数:

        cond:条件变量

当条件满足时,线程需要通知等待的线程

pthread_cond_signal 函数是通知单个线程

pthread_cond_broadcast 函数是通知所有线程

示例代码

#include <cstdio>
#include<pthread.h>
#include<iostream>
#include <unistd.h>
using namespace std;

/*
    一个线程负责计算结果,一个线程负责获取结果

*/
struct Result
{
    int res;
    int is_wait; //用户给出用于判断的条件
    pthread_cond_t cond;  //条件变量
    pthread_mutex_t mutex;  //互斥锁
};

//计算并将结果放置Result中的线程运行函数
void* set_fn(void *arg)
{
    Result *r=(Result*)arg;
    int i=1,sum=0;
    for(;i<=100;++i)
    {
        sum+=i;
    }
    r->res=sum;

    pthread_mutex_lock(&r->mutex);
    //判断获取结果的线程是否准备好
    while(!r->is_wait)
    {
        pthread_mutex_unlock(&r->mutex);
        usleep(100);

        pthread_mutex_lock(&r->mutex);
    }
    pthread_mutex_unlock(&r->mutex);

    //
    pthread_cond_broadcast(&r->cond);

    return (void*)0;
}

//获取结果的运行函数
void* get_fn(void* arg)
{
    Result *r=(Result*)arg;
    
    //对两个线程共享的判断条件进行保护(加锁)
    //两个线程对判断条件操作是互斥的
    pthread_mutex_lock(&r->mutex);
    //代表获取结果的线程准备好了
    r->is_wait=1;

    //获取结果的线程进行等待
    pthread_cond_wait(&r->cond,&r->mutex);
    
    //线程被唤醒后
    pthread_mutex_unlock(&r->mutex);
    
    //去获取计算的结果
    int res=r->res;
    cout<<"thread_id:"<<pthread_self()<<" get sum is "<<res<<endl;
    return (void*)0;
}


int main()
{
    int err;
    pthread_t cal,get;
    Result r;
    r.is_wait=0;
    //r.res=0;
    pthread_cond_init(&r.cond,NULL);
    pthread_mutex_init(&r.mutex,NULL);

    //启动获取结果的线程
    err=pthread_create(&get,NULL,get_fn,(void*)&r);
    if(err!=0)
    {
        perror("create error");
    }

    //启动计算结果的线程
    err=pthread_create(&cal,NULL,set_fn,(void*)&r);
    if(err!=0)
    {
        perror("create error");
    }
    
    pthread_join(cal,NULL);
    pthread_join(get,NULL);

    pthread_cond_destroy(&r.cond);
    pthread_mutex_destroy(&r.mutex);


    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值