条件变量---线程的同步与互斥

本文介绍了条件变量在多线程同步中的作用,详细阐述了条件变量的初始化、等待操作(wait和timedwait)、唤醒操作(broadcast和signal)以及如何通过条件变量实现生产者-消费者模型。在示例中展示了生产者和消费者线程如何通过条件变量实现互斥和同步,以确保数据的安全访问。
摘要由CSDN通过智能技术生成

condition variable 条件变量
目的是多线程同步,以一定合理顺序访问临界资源。

条件变量的接口
条件变量初始化和销毁函数
这里写图片描述
与mutex的初始化相同,有两种方式,函数初始化与全局变量宏的初始化

条件变量的等待操作
这里写图片描述
wait是阻塞式等待的函数,可见一个条件变量总是与一个互斥锁搭配使用,表示在摸个执行流的某个条件下等待;
timewait是非阻塞式等待,多了一个参数abstime时间片,表示要等待的时间。

pthread_cond_wait函数做了三个操作:

  1. 释放mutex;
  2. 阻塞式等待;
  3. 当被唤醒时,重新获得mutex并执行下面的操作

条件变量的唤醒操作:
这里写图片描述

broadcast函数表示唤醒所有正在等待的线程函数,signal表示只唤醒一个线程函数;

接下来我们建立生产者—-消费则模型来说明我们的问题
生产者—消费者模型是进程(线程)同步与互斥的一个典型的实例

  • 首先我们必须有两个对象,即生产者与消费者,我们用两个线程product和coumser来表示;
  • 于此同时,我们还需要生产者与消费者之间有一个交易的平台,即一个缓冲池,可以是一个结构体或是链表来存储数据,今天我们用单链表来实现;
  • 除此之外,我们还需要满足生产者与消费者之间的关系,即只有生产者将生产出来的产品(数据)放入交易平台(链表),消费者才能取到产品,而消费则获得产品时,生产者不能够放产品,即保证两者之间是互斥的;但生产者也不能够无限循环的去放产品,导致消费者没有机会去取产品,故两者也应该保证同步的关系;

    下面我们用代码实现一个生产者—–一个消费者的模型
    1.链表实现:
    这里写图片描述
    这里写图片描述

首先我们验证一下我们的链表是否实现正确
这里写图片描述
我这里验证我的链表可以正常push和pop,接下我们就需要创建我们的对象了
这里写图片描述
这里写图片描述

结果部分图为:显示生产则的竞争要强于消费则
这里写图片描述

我们也可以修改使得生产者的竞争弱,消费者的竞争强
这里写图片描述
部分结果图为:
这里写图片描述

2.接下来我们实现消者和生产者之间的互斥关系
这里写图片描述
这里写图片描述

3.在互斥的基础上实现生产者与消费者的同步关系
这里写图片描述

这里写图片描述

最终结果图:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值