linux系统编程---线程的条件控制实现线程同步---学习和记录(四)

条件变量的概念:本身不是锁,满足某个条件,像加锁一样,造成阻塞,与互斥量配合,给多线程提供会所。在线程抢占互斥锁时,线程A抢到了互斥锁,但是条件不满足,线程A就会让出互斥锁让给其他线程,然后等待其他线程唤醒他;一旦条件满足,线程就可以被唤醒,并且拿互斥锁去访问共享区。经过这中设计能让进程运行更稳定。

条件变量的创建:分为静态创建和动态创建

静态创建:在函数中声明一个宏,相当于动态创建的初始化

pthread_cond_t cond=PTHREAD_COND_INITIALIZER; //声明宏后则main函数不需要再初始化

动态创建和销毁:main函数里面进行初始化,函数里面都是2个无类型的指针;

//创建
int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);
int pthread_cond_destroy(pthread_cond_t *cond);//销毁
// 返回:若成功返回0,否则返回错误编号

cond:需要再全局变量中定义一个条件变量  pthread_cond_t cond;                                              attr:一般设置成NULL

条件的等待函数:2个都是指针(地址)

int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, cond struct timespec *restrict timeout);
// 返回:若成功返回0,否则返回错误编号

cond:定义的条件变量的地址,即初始化的 pthread_cond_t cond ;                                             mutex:互斥锁;

条件的触发和广播:                                                                                                                                       触发:触发表示唤醒任意一个等待该条件的线程  广播:而广播表示唤醒所有等待该条件的线程。

//触发
int pthread_cond_signal(pthread_cond_t cond);
//广播
int pthread_cond_broadcast(pthread_cond_t cond);
// 返回:若成功返回0,否则返回错误编号

函数例子:

#include <stdio.h>
#include <pthread.h>

int p_data = 0;
pthread_mutex_t mutex; //定义互斥量
pthread_cond_t cond; //定义条件变量

//就算是线程一先运行,(线程一会等待)
//因为它没有互斥锁,所以也会被线程二竞争过去,线程二有锁
void *func1(void *arg)
{
    while(1){
        pthread_cond_wait(&cond,&mutex); //等待条件满足
        printf("t1 p_data : %d\n",p_data++); //满足条件后,输出p_data
        printf("=========================\n");
        p_data = 0;    //复位p_data,方便下一次使用
        sleep(1);
    }
}

void *func2(void *arg)
{
    while(1){
        pthread_mutex_lock(&mutex); //加锁
        printf("t2 p_data : %d\n",p_data++); //打印值
        if(p_data == 5){ //是否满足条件
        	pthread_cond_signal(&cond); //通知线程一条件已经满足
        }
        pthread_mutex_unlock(&mutex);  //解锁
        sleep(1);
    }
}
int main()
{
    int ret;
    int param = 100;
    pthread_t t1; //线程一
    pthread_t t2; //线程二
    pthread_mutex_init(&mutex,NULL); //创建互斥量
    pthread_cond_init(&cond,NULL);   //创建条件量
    ret = pthread_create(&t1,NULL,func1,(void *)&param);
    ret = pthread_create(&t2,NULL,func2,(void *)&param);
    pthread_join(t1,NULL);
    pthread_join(t2,NULL);
    pthread_mutex_destroy(&mutex); //销毁互斥量
    pthread_cond_destroy(&cond);   //销毁条件量
    return 0;
}

函数运行状态:线程1存在条件的等待,所以线程2有互斥锁先竞争到必须要先运行完,等到线程2条件满足后,触发线程1的等待,线程2互斥锁解锁,线程1开始执行;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值