记linux下对条件量的学习(一)

本文介绍了Linux中条件量的概念及其在多线程同步中的重要作用。条件量结合互斥量,实现线程的高效协作,避免繁忙查询。文章详细讲解了`pthread_cond_init`、`pthread_cond_destroy`、`pthread_cond_wait`、`pthread_cond_timedwait`、`pthread_cond_signal`和`pthread_cond_broadcast`等关键函数的用法,并强调了在改变条件状态时需要保护线程队列和临界资源的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

信号量,互斥量,条件量是线程间保证线程同步的三种方式,其中信号量和互斥量是通过堵塞的方式来实现资源的竞争,试想一下,如果有多个消费者线程同时在等待一个生产者生产产品时,如果只用到互斥量,那么每个消费者线程在访问产品这个临界资源的时候都需要对互斥量metex进行先上锁,读取并且判断有无产品,再解锁地操作。但这是在浪费时间和资源,而且这种繁忙查询的效率非常低。同样,在每次检查之间让线程短暂地进入睡眠,比如睡眠1s,但是因此线程代码就无法最快作出响应。
这样也就有了条件量的使用,简单来说,使用条件量可以使原本堵塞的线程进入休眠状态,直到条件满足,休眠的线程被signal唤醒,执行操作,这样就不会产生竞争
条件量通常是配合互斥量一起用,其中条件量起到了唤醒线程的作用,而互斥量起到了保护条件的作用,线程在改变条件状态时首先先锁住互斥量,改变条件后,发送信号,再释放互斥量。(如果不使用互斥量,当有多个线程同时调用wait时,“等待线程“队列被多个同时访问,就会导致数据错乱)

相关函数

1. int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);

作用:条件量的初始化
返回值:成功返回,失败返回-1;
形参:
restrict cond :被初始化的条件量
restrict attr: 初始化的属性,一般设置为空

2. int pthread_cond_destroy(pthread_cond_t *restrict cond);

作用:条件量的销毁
返回值:成功返回,失败返回-1;
形参:
restrict cond :被销毁的条件量

3.int pthread_cond_wait(pthread_cond_t *restrict cond,(pthread_mutex_t *restrict mutex)

作用:线程通过调用wait进入等待被唤醒的线程队列中
返回值:成功返回,失败返回-1;
形参:
restrict cond :等待的条件量
restrict mutex : 与该条件量配套使用的互斥量

wait的内部实现

1.释放mutex锁
2.使线程休眠
3.等待条件改变

需要注意的是,等到条件改变后,争取到的线程应该先对mutex上锁,再对临界资源进行操作;为了防止线程被误唤醒,可以用一个while循环嵌套wait,while循环的结束条件是对 wait所等待的临界资源中某个值进行判断,以此来防止误唤醒。例如,要等待的资源是某个产品, 最开始产品数 count == 0,线程A被唤醒后,从wait中return出来,被while(!count)判断,判断此时的产品数量是否等于0,不满足则说明这是一次有效的wait,线程就可以执行接下去的代码。否则,说明是一次误唤醒,线程重新进入wait内部。

4.int pthread_cond_timewait(pthread_cond_t *restrict cond,(pthread_mutex_t *restrict mutex,const struct timespec * restrict tsptr)

作用:与wait类似,多了个时间结构体,当等待时间超过预定时间后,线程会被唤醒,重新获取互斥量,然后返回等待超时错误。
返回值:成功返回,失败返回-1;

5. pthread_cond_signal(pthread_cond_t *cond);

作用:线程通过调用signal唤醒 等待被唤醒的线程队列 中的某一个线程
返回值:成功返回,失败返回-1;
形参:
restrict cond :被通知的条件量

6. pthread_cond_broadcast(pthread_cond_t *cond);

作用:线程通过调用broadcast唤醒 等待被唤醒的线程队列 中的所有线程
返回值:成功返回,失败返回-1;
形参:
restrict cond :被通知的条件量

** 需要注意的是 **,线程在调用signal或者是broadcast的时候,同样也需要对mutex进行上锁,再改变临界资源并且发送信号通知,最后解锁mutex的操作,以保护线程队列和临界资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值