条件变量的创建和销毁
#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;
}