一步一步写线程之十三队列间的消息通知

一、线程和分布式的通信

随着技术的不断发展,多线程和分布式通信愈发的普及。那么在这种场景下的如何进行数据的通信,便成为了一个非常典型的问题。无论是多线程还是分布式,其实其抽象出来的通信机制都是类似的。或者说换句话,多线程和分布式被普及的原因是一样的,那就是如何解决大数据量的快速交互,即解决生产者和消费者的问题。
这种通信机制有很多种,在前面也分别的进行过阐述,比如常见的事件、管道、网络、消息等等。这些通信机制,各有各的优点和适用场景,当然也存在着各种各样的问题和缺点。这就需要开发者能够灵活的综合运用这些技术来解决问题。

二、生产者和消费者的平衡

回到最常见的生产者消费者的问题,即生产队列和消费队列的最优的动态平衡。生产者的线程和消费者的线程要匹配,既不能生产的过多,导致消费队列的积压甚至因此而崩溃,也不能因为生产者的产出太少,导致消费者队列的等待。
一般在这种情况下,可能很多开发者会选择使用线程同步来解决问题,也可能会使用一些消息框架来解决这类问题。可同步带来的性能损失,如何降低到最低?那如果使用无锁编程呢?会不会带来效率的显著提升?

三、问题和解决

从上面的分析可以判断出,其实无论哪种方式,都需要处理同步的粒度的问题。举一个简单的例子,一个生产者和一个消费者,生产者在把消息压入队列后就进行一个同步的通知(不管是使用事件还是条件变量等),还是等到某种条件下再进行同步通知效率更高呢?也就是说,不用每次生产后都进行通知,而在某种情况下才会通知。由于同步事件的通知会导致线程的切换和上下文的处理,所以基本上可以判定,后者会更优。但优多少需要实际的场景进行验证。只是从理论上看,这种情况是占有优势的。
在无锁队列中,如果生产者速度比较慢,消费者比较快,CAS的原理是占用CPU进行自旋等待,那设计上肯定不能让消费者没事总那儿旋转占用着CPU,一般会有一个机制在多长时间后进行等待机制让出CPU。或者在突传情况下,CAS自旋就非常有意义,但在突传过后,CAS一定要让出CPU。所以就可以基本得出一个结论,在消费者让出CPU休眠时,再进行同步通知进行唤醒,此时的效果肯定是最佳的。
这种机制不光是推理出来,在实践中也是如此,比如使用一些开源框架中即是进行这样设计的。一些开源的无锁队列,经过测试发现,连续通知和休眠后通知,其实效率还是差不少的。这也是一个非常明显的例证。
那么如何进行线程间状态的判断呢?这个有很多种方法,一般来说可以设置一个双方都需要读写操作的变量,而CAS正是擅长对这种固定值的判断的,通过固定值与队列间的某种特定的条件,即可判断互相的状态。

四、总结

其实队列的处理,不光有这种细节需要处理,包括内存大小的处理,是否提前处理,都是需要考虑的。正如前面所说,一个队列的设计,不仅仅是一个算法的问题,可能涉及到很多的技术知识和相关的难点。如何能够综合运用这些知识适配开发场景,就是对设计师的一个考验了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/20112.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java检测字符串是否包含数字和字母

在Java中,要检测一个字符串是否同时包含数字和字母,我们可以使用正则表达式(regex)或者通过遍历字符串并检查每个字符来实现。以下是两种方法的详细代码示例: 1.方法一:使用正则表达式 import java.util.…

【AI+知识库问答】沉浸式体验了解 AI知识库问答fastGPT

之前写过一篇文章 【AI本地知识库】个人整理的几种常见本地知识库技术方案 , 由于当时主要是针对AI本地知识库, 所以没列fastGPT。 最近经常刷到fastGPT,这里单独水一篇。 FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,…

Github 2024-06-01 开源项目日报Top10

根据Github Trendings的统计,今日(2024-06-01统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目5Jupyter Notebook项目2TypeScript项目1Go项目1Shell项目1Lua项目1Kong:云原生API网关与AI能力 创建周期:3482 天开发语言:Lua协议…

如何确保绩效目标执行到位?

很多企业在实施绩效过程中,尽管制定好了绩效目标,但是没有执行下去,管理者将原因归咎于“员工低效”、“体制机制”等问题,那么在人力资源管理方面,企业应该如何确保制定的绩效目标执行到位?如何提高低效能…

云原生架构相关技术_4.服务网格

1.技术特点 服务网格(ServiceMesh)是分布式应用在微服务软件架构之上发展起来的新技术,旨在将那些微服务间的连接、安全、流量控制和可观测等通用功能下沉为平台基础设施,实现应用与平台基础设施的解耦。这个解耦意味着开发者无需…

React@16.x(14)context 举例 - Form 表单

目录 1,目标2,实现2.1,index.js2.2,context.js2.2,Form.Input2.3,Form.Button 3,使用 1,目标 上篇文章说到,context 上下文一般用于第3方组件库,因为使用场景…

Chisel入门——在windows下vscode搭建|部署Scala2.13.3开发环境|用Chisel点亮FPGA小灯等实验

文章目录 前言一、vscode搭建scala开发环境1.1 安装Scala官方插件1.2 创建hello_world.scala文件1.3 确认java的版本(博主使用的是1.8)1.4 下载Scala Windows版本的二进制文件1.5 配置环境变量1.6 交互模式测试一下1.7 vscode运行scala 二、windows安装sbt2.1 下载sbt2.2 设置环…

函数递归及具体例子(持续更新)

递归就是函数自己调用自己 求n的阶乘 n! n * (n - 1)! 直到n为1或者0的时候为止 举个例子 int Fun(int n) {if (n < 0){return 1;}else{return n * Fun(n - 1);} }int main() {int n 0;scanf("%d", &n);int ret Fun(n);printf("%d\n", ret…

安装Kubernetes v3 ----以docker的方式部署

以docker的方式部署 docker run -d \ --restartunless-stopped \ --namekuboard \ -p 80:80/tcp \ -p 10081:10081/tcp \ -e KUBOARD_ENDPOINT"http://192.168.136.55:80" \ -e KUBOARD_AGENT_SERVER_TCP_PORT"10081" \ -v /root/kuboard-data:/data \ e…

springboot中抽象类无法注入到ioc容器

1、背景 在写代码时&#xff0c;发现service接口有两个实现类&#xff0c;并且两个实现类中没有对类名重命名&#xff0c;属性注入的时候也没有使用byName或Qualifier&#xff0c;正确情况下会发生多实现报错的问题&#xff0c;以前对这个问题进行解析过。 2、调试过程 我想…

【设计模式】创建型-建造者模式

前言 在面向对象的软件开发中&#xff0c;构建复杂对象时经常会遇到许多挑战。一种常见的解决方案是使用设计模式&#xff0c;其中建造者模式是一个强大而灵活的选择。本文将深入探讨建造者模式的原理、结构、优点以及如何在实际项目中应用它。 一、复杂的对象 public class…

飞凌嵌入式FET3568/3568J-C核心板现已适配OpenHarmony4.1

近日&#xff0c;飞凌嵌入式为FET3568/3568J-C核心板适配了OpenHarmony4.1系统&#xff0c;新系统的加持使核心板在兼容性、稳定性与安全性等方面都得到进一步提升&#xff0c;不仅为FET3568/3568J-C核心板赋予了更强大的功能&#xff0c;也为开发者们提供了更加广阔的创新空间…

每日一练编程题:今天是【接口,多态】

设计程序 : 电脑类的属性USB接口数组 : 有3个usb插口电脑类的功能 : 通过接口插入外设 (u盘,麦克风,键盘等) addUSB(USB usb) { }开机 要求: 电脑开机前,先启动外设关机 要求: 电脑关机前,先关闭外设 外设类(u盘,麦克风,键盘等) 功能 : 启动 关闭 USB接口 定义usb设备的统一…

python多种方式 保留小数点位数(附Demo)

目录 前言1. 字符串格式2. round函数3. Decimal模块4. numpy库5. Demo 前言 在Python中&#xff0c;保留小数点后特定位数可以通过多种方式实现 以下是几种常见的方法&#xff0c;并附上相应的代码示例&#xff1a; 使用字符串格式化&#xff08;String Formatting&#xff…

IDE集成开发环境

IDE集成开发环境&#xff0c;全称“Integrated Development Environment” 介绍 定义&#xff1a; IDE是用于提供程序开发环境的应用程序&#xff0c;它集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。 组成部分&#xff1a; IDE通常包括代码编…

Ubuntu20.04 Mysql基本操作知识

#Mysql基本知识 运行环境Ubuntu20.04 1.开启mysql服务 sytemctl start mysql不然&#xff0c;命令行进入myql交互行提交命令后&#xff0c;就会出现4200错误。 2.显示所有数据库 SHOW DATABASES;注意复数s&#xff0c;毕竟很多数据库 3.新建数据库test CREATE DATABASE …

【学习笔记】计算机组成原理(九+十)

控制单元的功能 文章目录 控制单元的功能9.1 微操作命令的分析9.1.1 取指周期9.1.2 间址周期9.1.3 执行周期9.1.4 中断周期 9.2 控制单元的功能9.2.1 控制单元的外特性9.2.2 控制信号举例9.2.3 多级时序系统9.2.4 控制方式 控制单元的设计10.1 组合逻辑设计10.1.1 组合逻辑控制…

LabVIEW与Simulink的通信及调用方式

LabVIEW和Simulink可以通过多种方式进行通信和集成&#xff0c;实现数据交互和功能调用。常见的通信方式包括TCP/IP、UDP、共享内存等&#xff0c;此外还可以利用MATLAB Script Node和S-Function等直接调用对方的功能。这些方法使得LabVIEW和Simulink能够协同工作&#xff0c;充…

[Algorithm][动态规划][子序列问题][最长递增子序列的个数][最长数对链]详细讲解

目录 1.最长递增子序列的个数1.题目链接2.算法原理详解3.代码实现 2.最长数对链1.题目链接2.算法原理详解3.代码实现 1.最长递增子序列的个数 1.题目链接 最长递增子序列的个数 2.算法原理详解 注意&#xff1a;本题思路和思维方式及用到的方法很值得考究&#xff0c;个人感…

dubbo复习:(18)服务端Filter

用来在服务响应返回到客户端之前进行额外处理。 一、定义Filter package cn.edu.tju.config;import org.apache.dubbo.rpc.Filter; import org.apache.dubbo.rpc.Result; import org.apache.dubbo.rpc.Invoker; import org.apache.dubbo.rpc.Invocation; import org.apache.du…