学习记录(4.1)-----面向对象生产者消费者封装

1、预备知识

生产者和消费者问题,简单来说就是多线程问题,就会涉及到线程之间对共享资源的互斥访问,所以我们先复习一下互斥锁与条件变量的相关知识

1.1 互斥锁mutex
1.1.1 基本概念

 数据混乱的三个原因:

1,资源共享

2,随机调度

3,线程间缺乏必要的同步机制

什么是互斥锁?解决了什么问题?

互斥锁(Mutex)是一种用于多线程编程的同步机制,用于解决并发访问共享资源时可能引发的竞争条件问题。在多线程环境下,如果多个线程同时访问共享资源并尝试对其进行修改,可能导致数据不一致或者程序错误的情况发生。互斥锁通过在代码中设定临界区域(Critical Section),确保同一时间只有一个线程可以进入临界区域执行代码,从而防止多个线程同时对共享资源进行修改,保证了数据的一致性和程序的正确性。

互斥锁通常提供了两个基本操作:锁定(Lock)和解锁(Unlock)。当一个线程希望进入临界区域时,它首先尝试获取互斥锁,如果锁处于可用状态,则该线程获得锁,并且进入临界区域执行代码;如果锁已经被其他线程持有,则该线程可能会被阻塞,直到锁变为可用状态。当线程执行完临界区域的代码后,它会释放互斥锁,使得其他线程可以获取锁进入临界区域。

互斥锁通常提供了两个基本操作:锁定(Lock)和解锁(Unlock)。当一个线程希望进入临界区域时,它首先尝试获取互斥锁,如果锁处于可用状态,则该线程获得锁,并且进入临界区域执行代码;如果锁已经被其他线程持有,则该线程可能会被阻塞,直到锁变为可用状态。当线程执行完临界区域的代码后,它会释放互斥锁,使得其他线程可以获取锁进入临界区域。

1.2.1 互斥锁相关函数复习

秉承一个原则:有问题就man一下!!!就会知道答案

1,互斥锁的创建-pthread_mutex_t mutex(创建一把互斥锁)

2,互斥锁的初始化

3,互斥锁的销毁

4,互斥锁加锁

5,互斥锁的解锁

1.2 条件变量 condition 
1.2.1 基本概念

条件变量(Condition Variable)是多线程编程中用于线程间通信的一种同步机制。它用于在线程之间传递信息,以便一个线程可以等待某个特定的条件发生,而另一个线程可以在条件满足时通知等待线程。

条件变量通常与互斥锁(Mutex)结合使用,以便在临界区域中对共享资源进行访问时保证线程安全。条件变量提供了三种基本操作:

  1. 等待(Wait): 等待某个条件的发生。当一个线程调用条件变量的等待操作时,它将自动释放与之关联的互斥锁,并进入等待状态,直到其他线程通过信号(Signal)或者广播(Broadcast)操作通知条件满足。

  2. 信号(Signal): 发送信号通知一个等待在条件变量上的线程。这个操作通常用于只需要唤醒一个等待线程的情况。

  3. 广播(Broadcast): 发送广播通知所有等待在条件变量上的线程。这个操作通常用于需要通知多个等待线程的情况。

 常见的使用场景包括生产者-消费者问题、线程池、任务调度等多线程编程中需要协调和同步的情况。例如,在生产者-消费者问题中,生产者线程负责生产数据,消费者线程负责消费数据,条件变量可以用来确保消费者线程在生产者线程生产数据后才进行消费,以避免竞争条件问题和不必要的资源消耗。

1.2.2 条件变量相关函数复习

1,条件变量的创建 pthread_cond_t cond (定义一个条件变量)

2,条件变量的初始化

3, 条件变量的销毁

4,条件变量的等待

 

5,条件变量的唤醒

 

1.3 面向对象的生产者消费者封装

生产者与消费者问题,是一个经典的常规问题,其实也是线程问题。可以把生产者看成是一个线程,也可以把消费者看成是一个线程,两个线程都可以继承自之前上面封装的抽象类Thread,然后再实现虚 法run。当然,因为生产者与消费者需要从共享的仓库中存数据或者取数据,设计到对仓库的互斥访问,所以需要加锁,当然在这里我们把仓库用一个任务队列TaskQueue进行封装,提供互斥锁、条件变 量的基本数据成员,当然任务队列里面也就是基本操作,队列是不是满的,是不是空的,存数据与取数 据等基本操作。当然,之前的互斥锁与条件变量是可以进行封装的,全部使用面向对象的思想,抽象为类,于是就可以画出如下类图。

  • 44
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值