首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux线程-生产消费模型和线程池

Linux生产消费模型和线程池 零、前言 一、生产消费者模型 二、阻塞队列生产消费模型 三、环形队列生产消费模型 四、线程池threadpool 五、线程安全的单例模式 1、饿汉模式 2、懒汉模式 六、...STL智能指针和线程安全 七、其他常见的各种锁 八、读者写者问题 零、前言 本章主要讲解学习Linux线程章节的后一部分,主要介绍生产消费者模型以及线程池等等的学习 一、生产消费者模型 什么是生产消费者模型...,或者某种数据的组织方式 主要过程:生产者将生产的数据或者任务放入到交易场所中,消费者从交易产所拿取数据或者任务 生产者和生产者/消费者和消费者/生产者和消费者的互斥关系: 交易产所是被多个生产者和消费者共同所见的...其中,所有的生产者和消费者都会竞争式的申请锁,因此生产者和生产者、消费者和消费者、生产者和消费者之间都存在互斥关系 生产者和消费者之间的同步关系: 由于交易产所的容量有限,如果让生产者一直生产,...(生产和消费者)之间协同起来 为何要使用生产者消费者模型: 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题 生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理

3.2K20

Linux】生产者 消费者模型

消费者有可能去购买时,供货商当前并没有进行生产活动 假设要一根火腿肠,供货商不可能将机器全启动进行生产 消费者需求特别零散,供货商生产能力很强,但要考虑成本问题 所以需要超市这种零售行业,超市的存在使生产者和消费者的效率提高了...供货商可以集中生产的一大批的商品 放到超市中,让消费者随时随地来买,供货商就不生产了 因为超市的存在,允许生产和消费步调不一致 ---- 在计算机中,生产者和消费者代表线程 超市可以看作是 特定的缓冲区...生产者把自己的数据交给超市,再由消费者把数据取走 ,这种工作模式即 生产者 消费者模型 基于 生产者 消费者模型,来完成线程之间的通信 想要使用交易场所,前提是交易场所必须先被生产者和消费者线程看到...生产消费模型 角色之间的关系 1.生产者和生产者 生产者和生产者 为互斥关系 假设两者都要生产火腿肠,当生产者1正在生产时,生产者2也要生产就不可以 ---- 2.消费者和消费消费者和消费者 为...互斥关系 v假设超市货架上只有一根火腿肠了,有两个人都看上了这根火腿肠,此时两者就为竞争关系 ---- 3.生产者和消费者 生产和消费 拥有 同步关系 需要生产是先生产,需要消费是先消费 如:若超市火腿肠满了

13440
您找到你想要的搜索结果了吗?
是的
没有找到

Linux多线程【生产者消费者模型】

✨个人主页: 北 海 所属专栏: Linux学习之旅 操作环境: CentOS 7.6 腾讯云远程服务器 前言 生产者消费者模型(CP模型)是一种非常经典的设计,常常出现在各种 「操作系统」...,很好地做到了 解耦,便于维护和扩展 2、基于阻塞队列实现生产者消费者模型 2.1、阻塞队列 编写 「生产者消费者模型」 需要用到 Linux 互斥与同步 的知识,这里先选择 阻塞队列 作为交易场所进行实现...】、【命名管道】、【匿名管道】 Linux基础IO ===== :> 【软硬链接与动静态库】、【深入理解文件系统】、【模拟实现C语言文件流】、【重定向及缓冲区理解】、【文件理解与操作】 Linux...进程控制 ===== :> 【简易版bash】、【进程程序替换】、【创建、终止、等待】 Linux进程学习 ===== :> 【进程地址】、【环境变量】、【进程状态】、【基本认知】 Linux基础...===== :> 【gdb】、【git】、【gcc/g++】、【vim】、Linux 权限理解和学习、听说Linux基础指令很多?

31030

Linux】多线程 --- 线程同步与互斥+生产消费模型

一个用户的消费咋能养活一个铁路局呢?肯定得多个用户消费啊!...在只有一份超市共享资源的情况下,生产和生产,消费消费,以及生产和消费都需要进行串行的访问共享资源。...但为了提高效率我们搞出了同步这样的关系,因为有可能消费者一直霸占着锁,一直在那里消费,但实际超市已经没有物资了,此时消费者由于竞争能力过强,也会造成不合理的问题,因为消费消费过多之后,应该轮到生产者来生产了...而实现线程同步就需要一个条件变量,比如生产者生产完之后,超市给消费者打个电话,让消费者过来消费消费完之后,超市在给生产者打个电话,让生产者来生产,这样就不会存在由于某一个线程竞争能力过强,一直生产或一直消费的情况产生...到此为止我们就谈完了整个的双阻塞队列实现的多生产多消费模型,下面是程序的运行结果,我们很好的实现了计算任务的生产消费,保存任务的生产消费,且是在多个生产者多个消费者的多线程情景下实现的生产消费模型。

21130

Linux之生产者消费者模型(上)——单生产者单消费

既然是共享资源,又被两个线程(生产和消费)并发访问,那么该共享资源需要被保护起来。 321原则 三种关系:生产者和消费者互斥,消费者和消费者互斥,生产者和消费者同步。...生产消费模型的特点 生产线程和消费线程要进行解耦; 支持生产和消费可能有一段时间的忙闲不均问题(因此,缓冲区要有足够的空间,提前预存数据); 生产者专注生产,消费者专注消费(互相不影响),从而提高效率。...2.单生产单消费模型 代码 本例子让生产者线程生产随机数,消费消费生产出的数字。...nullptr); 82 pthread_join(pro, nullptr); 83 return 0; 84 } 运行: 总结 以上就是今天要讲的内容,本文介绍了Linux...本文作者目前也是正在学习Linux相关的知识,如果文章中的内容有错误或者不严谨的部分,欢迎大家在评论区指出,也欢迎大家在评论区提问、交流。

21040

RabbitMQ延迟消费和重复消费

延迟任务的模型如下图: 基于 RabbitMQ 实现的分布式延迟重试队列 场景一:在消费该消息的时候,发现条件不满足,需要等待30分钟,重新消费该消息,再次判断是否满足条件,如果满足则消费该消息,如果不满足...在消息队列的监听过程中,先判断条件是否满足,满足,则直接消费。不满足,则将该消息发送到上图的死信队列,但是在死信队列失效之后,需要重新转发到当前队列进行消费就可以实现该功能。...对队列设置就是队列没有消费者连着的保留时间,也可以对每一个单独的消息做单独的设置。超过了这个时间,我们认为这个消息就死了,称之为死信。如果队列设置了,消息也设置了,那么会取小的。...不会被消费消费到。这个消息后面的,没有“死掉”的消息对顶上来,被消费消费。死信在队列中并不会被删除和释放,它会被统计到队列的消息数中去。...也就是说不会被再次放在队列里,被其他消费者使用。 2. 上面的消息的TTL到了,消息过期了。 3. 队列的长度限制满了。排在前面的消息会被丢弃或者扔到死信路由上。

2.1K20

Linux线程同步与互斥(二)生产消费者模型

⭐前言:本文会先后讲解生产消费者模型、条件变量和基于阻塞队列的生产消费者模型。 1.生产消费者模型 什么是生产消费者模型?...认识生产消费者模型 使用学生(消费者),超市,供货商(生产者)来举一个例子。 学生是典型的消费者,供货商是典型的生产者。...因此,从上面例子来正确认识一下生产消费者模型: 超市(缓冲区)作为消费消费的地方,生产者放资源的地方,它必须要让消费者和生产者都看到,即它是一份共享资源!...生产者和消费者是线程,顾名思义,作为生产者的线程用于向缓冲区存入数据,消费者线程向缓冲区拿数据。 因此,生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。...消费者和消费者之间的关系也是互斥关系。很简单的一个例子:黄牛抢票。 消费者和生产者的关系也是有互斥关系。

72320

Linux】生产者消费者模型——阻塞队列BlockQueue

生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。 生产消费关系 生产和消费都要看到“超市”,所以“超市”是一块共享资源。...二种角色:生产者线程,消费者线程 一个交易场所:一段特定结构的缓冲区 想写生产消费模型,本质就是在维护321原则 挖掘特点: 1.未来生产线程和消费线程进行解耦 2.支持生产和消费的一段时间的忙闲不均的问题...(缓存区有数据有空间) 3.生产者专注生产,消费专注消费,提高效率 如果超市缓冲区满了,生产者只能进行等待,如果超市缓冲区为空,消费者只能进行等待。...:生产一个消费一个,而且消费的都是最新的数据 如果生产者生产快,消费消费慢:稳定后,消费一个生产一个 计算器任务Task Task.hpp:包含func_t的回调函数,这个函数就是进行数据计算的回调函数...消费者与消费者也要竞争锁 **换句话来说:在阻塞队列中,无论外部线程再多,真正进入到阻塞队列里生产或消费的线程永远只有一个。

15040

RocketMQ事务消费和顺序消费详解

一、RocketMq有3中消息类型 1.普通消费 2. 顺序消费 3.事务消费 顺序消费场景 在网购的时候,我们需要下单,那么下单需要假如有三个顺序,第一、创建订单 ,第二:订单付款,第三:订单完成。...RocketMQ可以保证顺序消费。...rocketMq实现顺序消费的原理 produce在发送消息的时候,把消息发到同一个队列(queue)中,消费者注册消息监听器为MessageListenerOrderly,这样就可以保证消费端只有一个线程去消费消息...9876;192.168.100.149:9876;192.168.100.239:9876"); /** * 设置Consumer第一次启动是从队列头部开始消费还是队列尾部开始消费...9876;192.168.100.149:9876;192.168.100.239:9876"); /** * 设置Consumer第一次启动是从队列头部开始消费还是队列尾部开始消费

67730

RocketMQ客户端PUSH消费--并发消费与顺序消费【源码笔记】

目录 一、消息拉取与处理 1.消息拉取 2.消息处理 二、并发消费 1.ConsumeMessageConcurrentlyService职责 三、顺序消费流程 1.ConsumeMessageOrderlyService...也可以通过挂起消费线程来延迟(1秒)消息拉取,从而达到消费限流作用。 2.消息处理 ?...;对于失败消息,广播消费会丢弃,集群消费会发回Broker重新消费;清理ProcessQueue并更新缓存(offsetTable)消费进度。...三、顺序消费流程 1.ConsumeMessageOrderlyService职责 ?...小结:顺序消费流程跟并发消费最大的区别在于,对要处理的队列加锁,确保同一队列,同一时间,只允许一个消费线程处理。 1.为什么顺序消费时需要对Broker发请求对要处理的队列加锁?

2.8K60

Kafka消费者 之 指定位移消费

放弃不难,但坚持很酷~ 由于消费者模块的知识涉及太多,所以决定先按模块来整理知识,最后再进行知识模块汇总。今天学习一下消费者如何指定位移消费。...一、auto.offset.reset值详解 在 Kafka 中,每当消费者组内的消费者查找不到所记录的消费位移或发生位移越界时,就会根据消费者客户端参数 auto.offset.reset 的配置来决定从何处开始进行消费...,是消费不到数据的。...四、从分区开头或末尾开始消费 如果消费者组内的消费者在启动的时候能够找到消费位移,除非发生位移越界,否则 auto.offset.reset 参数不会奏效。...最后又介绍了如何根据时间戳来消费指定消息,更加务实一些。 即使消息已被提交,但我们依然可以使用 seek() 方法来消费符合一些条件的消息,这样为消息的消费提供了很大的灵活性。

15.7K61

RocketMQ之消费者启动与消费流程

%n"); }}下面让我们来分析消费者在启动中每一阶段中做了什么吧,let’s go.2.1 实例化消费者第一步主要是实例化消费者,这里采取默认的Push消费者模式,构造器中参数为对应的消费者分组...,消费进度在本地单独进行存储;集群模式下,同一条消息只会被同一个消费消费一次,消费进度会参与到负载均衡中,消费进度是共享在整个消费组中的。...:要保证消息顺序消费,同一个queue就只能被一个消费者所消费,因此对broker中消费队列加锁是无法避免的。...同一时刻,一个消费队列只能被一个消费消费消费者内部,也只能有一个消费线程来消费该队列。这里RocketMQ已经为我们实现好了。...五、消息ack机制5.1 消息消费失败处理消息被消费消费了,那么如何保证被消费成功呢?消息消费失败会出现什么情况呢?消息被消费,那么如何保证被消费成功呢?

89520

KafkaRocketMQ 多线程消费时如何保证消费顺序?

本文将从消费顺序性这个问题出发,深度剖析 Kafka/RocketMQ 消费线程模型。...但这个消费模型由于消费逻辑是利用多线程进行消费的,因此并不能保证其消息的消费顺序,在这里我们可以引入阻塞队列的模型,一个 woker 线程对应一个阻塞队列,线程不断轮训从阻塞队列中获取消息进行消费,对具有相同...但是以上两个消费线程模型,存在一个问题: 在消费过程中,如果 Kafka 消费组发生重平衡,此时的分区被分配给其它消费组了,如果拉取回来的消息没有被消费,虽然 Kakfa 可以实现 ConsumerRebalanceListener...因此在消费前,还需要主动进行判断此分区是否被分配给其它消费者处理,并且还需要锁定该分区在消费当中不能被分配到其它消费者中(但 kafka 目前做不到这一点)。...2)向 Broker 端请求锁定当前顺序消费的队列,防止在消费过程中被分配给其它消费者处理从而打乱消费顺序。

3.4K30

体验首款Linux消费级平板,原来芯片和系统全是国产

如果安卓版WPS用得不爽,可以装Linux版。 但既然是Linux平板,做好安卓生态里的办公、娱乐需求只是本分。 重点还得考察:搞开发。...这里专指Linux平板需要解决软件生态。 Linux系统本身的软件生态自然不用怀疑,因为Linux已经渗透到各个领域,大到超算中心,小到路由器,都在使用Linux系统。...但是搭载ARM处理器的消费级平板太少了,Linux生态还没有做好太多准备,相对不够完善。 在体验JingPad过程中,感受尤其明显。...如果在网上搜索“Linux+Tablet”,得到的大多数问题不是与产品相关,而是平板如何安装Linux系统。一些问题甚至能追溯到10年前。 可见,Linux平板一直以来都有市场需求。...消费级的平板ARM芯片主要由高通、联发科与国产的紫光展锐等提供,这些芯片基本都是为Android设计,厂商不提供Linux硬件驱动,所以让这类芯片运行Linux就要面临自己开发驱动的困难。

2.1K30

消费端如何保证消息队列MQ的有序消费

尽管消费端在拉取消息时是有序的,但各个消息由于网络等方面原因无法保证在各个消费端中处理时有序。...假设1:消息A只包含修改的商品名称,消息B只包含修改的商品重量,此时消息队列的消费端实际上不需要关注消息时序,消息队列消费端(Consumer)只管消费即可。...消费端在接收消息时,通过缓存时间戳的方式,消费消息时判断消息产生的时间是否最新,如果不是则丢弃,如果是则执行下一步。...例如:消费消费消息B,执行到获取时间戳缓存之后,并在重新设置新的缓存之前,此时另一个消费端恰好也正在消费B它也正执行到获取时间戳缓存,由于消息A此时并没有更新缓存,消息A拿到的缓存仍然是旧的缓存,这时就会存在两个消费端都认为自己所消费的消息时最新的...这是从业务角度保证消息在消费端有序消费。通过在消息发送端全量发送消息以及在消息消费端缓存时间戳就可以保证消息的有序消费。 在上述场景中是先同步写入MySQL,再获取商品全量数据,接着再异步发送消息。

82410
领券