condition variable 条件变量
目的是多线程同步,以一定合理顺序访问临界资源。
条件变量的接口
条件变量初始化和销毁函数
与mutex的初始化相同,有两种方式,函数初始化与全局变量宏的初始化
条件变量的等待操作
wait是阻塞式等待的函数,可见一个条件变量总是与一个互斥锁搭配使用,表示在摸个执行流的某个条件下等待;
timewait是非阻塞式等待,多了一个参数abstime时间片,表示要等待的时间。
pthread_cond_wait函数做了三个操作:
- 释放mutex;
- 阻塞式等待;
- 当被唤醒时,重新获得mutex并执行下面的操作
条件变量的唤醒操作:
broadcast函数表示唤醒所有正在等待的线程函数,signal表示只唤醒一个线程函数;
接下来我们建立生产者—-消费则模型来说明我们的问题
生产者—消费者模型是进程(线程)同步与互斥的一个典型的实例
- 首先我们必须有两个对象,即生产者与消费者,我们用两个线程product和coumser来表示;
- 于此同时,我们还需要生产者与消费者之间有一个交易的平台,即一个缓冲池,可以是一个结构体或是链表来存储数据,今天我们用单链表来实现;
除此之外,我们还需要满足生产者与消费者之间的关系,即只有生产者将生产出来的产品(数据)放入交易平台(链表),消费者才能取到产品,而消费则获得产品时,生产者不能够放产品,即保证两者之间是互斥的;但生产者也不能够无限循环的去放产品,导致消费者没有机会去取产品,故两者也应该保证同步的关系;
下面我们用代码实现一个生产者—–一个消费者的模型
1.链表实现:
首先我们验证一下我们的链表是否实现正确
我这里验证我的链表可以正常push和pop,接下我们就需要创建我们的对象了
结果部分图为:显示生产则的竞争要强于消费则
我们也可以修改使得生产者的竞争弱,消费者的竞争强
部分结果图为:
2.接下来我们实现消者和生产者之间的互斥关系
3.在互斥的基础上实现生产者与消费者的同步关系
最终结果图: