文章目录
1、原理
假设我们需要解决这样一个问题:一个列表记录需要处理的任务。一个线程往此列表添加任务,一个线程processTask处理此列表中的任务。这个问题的一个关键点在于processTask怎么判断任务列表不为空。一般有两种方法:
一. processTask线程不断查询任务列表是否为空。
二. 当列表不为空的时候,通知processTask处理相关任务。
第一种方法往往是在一个while循环中判断列表是否为空,如果为空则睡眠一段时间,如果不为空那么把任务取出来并加以处理。此方案需要一个睡眠时间的平衡点如果睡眠时间太长,任务得不到及时的处理,降低效率。如果睡眠时间过短占用CPU资源,却什么都不做,浪费CPU做其它事情的时间。
第二种方法就比较靠谱了,只有当列表不为空的时候才占用CPU的时间,其它时间什么都不做除了睡觉(线程挂起)。此方案就是我们所说的条件变量(condition variable)。
一般条件变量(condition variable)和互斥量结合使用。条件变量(condition variable)用途线程间资源的同步,互斥量(mutex)用途资源的互斥(唯一访问)。 一个通俗易懂的例子: 你上厕所的时候,条件变量告诉你厕所是否为空位,有空位你上,没空位你看着别人上。有空位的时候你不可能跟别人一起吧,所以你得给卫生间上锁也就是互斥量了。
线程a等待某个条件成立,条件成立,线程a才继续向下执行。线程b的执行使条件成立,条件成立之后唤醒线程a,以继续执行。这个条件就是条件变量
pthread_cond_t 就是条件变量类型
2、头文件
#include <pthread.h>
3、 函数库
3.1、初始化
pthread_cond_t cond = PTHREA