当前位置: 首页 > news >正文

C++多线程编程时的伪共享问题及其定位和解决

一、引言

在多线程编程和共享内存系统中,为了提高程序性能,常常需要对共享数据进行处理。然而,在并发环境下,一种名为“伪共享(False Sharing)”的问题可能会悄然出现,它虽然不像传统的多线程同步问题(如数据竞争)那样广为人知,但却会对程序的性能产生严重的负面影响。因此,深入理解伪共享的概念、危害以及定位和解决方法,对于编写高效的并发程序至关重要。

二、什么是伪共享

伪共享是指多个线程同时修改位于同一缓存行(Cache Line)的不同变量时,由于缓存一致性协议的影响,导致缓存行在不同核心之间频繁无效化和重新加载,从而引起性能下降的现象。

为了更好地理解伪共享,需要先了解缓存行的概念。现代计算机处理器通常会将主存中的数据分成固定大小的块(一般为 64 字节)加载到高速缓存(Cache)中,这个固定大小的块就是缓存行。缓存一致性协议(如 MESI 协议)用于保证多个核心之间的缓存数据一致性。当一个核心修改了某个缓存行中的数据时,其他核心中缓存该行数据的副本会被标记为无效。

假设有两个独立的变量 ab,分别被两个不同的线程频繁修改。如果它们在内存中的存储位置相邻,并且恰好处于同一个缓存行中,那么当一个线程修改 a 时,会将所在的缓存行标记为无效。此时,另一个核心中缓存该缓存行副本的线程,尽管只对 b 进行操作,但由于缓存行无效,也需要从主存中重新加载该缓存行,这就产生了额外的开销,导致伪共享问题。

三、伪共享的危害

  1. 性能大幅下降:频繁的缓存行无效化和重新加载会占用大量的 CPU 时间,使线程不得不花费更多的时间等待数据从主存或其他缓存中获取,从而降低了程序的执行速度。在高并发环境下,这种影响可能会被放大,导致程序性能远不如预期。
  2. 资源浪费:由于缓存行的无效化和重新加载,浪费了宝贵的缓存资源,也降低了内存带宽的利用率。这使得原本可以更高效地利用硬件资源的情况变得资源紧张,进一步影响程序的整体性能。

四、如何定位伪共享

  1. 性能分析工具
    • Intel VTune Profiler:这是一款专业的性能分析工具,可用于分析多线程程序的性能瓶颈。它能够检测出缓存行利用率低和伪共享导致的性能问题,并提供详细的分析报告,包括哪些缓存行存在频繁的无效化和重新加载。
    • AMD uProf:对于 AMD 架构的处理器,uProf 可以帮助分析程序在多线程环境下的缓存行为,识别出潜在的伪共享问题。它通过收集程序运行过程中的各种性能数据,为用户提供清晰的性能分析结果。
  2. 代码优化技巧结合观察
    • 添加填充字节:在对可能出现伪共享的共享变量周围添加填充字节,强制将这些变量分散到不同的缓存行中。在添加填充字节后,观察程序的性能变化。如果性能得到显著提升,那么很可能之前存在伪共享问题。例如:
#include <atomic>// 定义两个原子变量,并通过填充避免伪共享
struct alignas(64) PaddedAtomicCounter {std::atomic<int> counter1;char padding[60]; // 填充字节数根据缓存行大小调整std::atomic<int> counter2;
};PaddedAtomicCounter counters;
- **使用性能监测指令**:某些处理器提供了专门的性能监测指令,可以在代码中手动插入这些指令来收集缓存命中率、缓存行访问情况等信息。通过对这些信息的分析,判断是否存在伪共享的情况。不过,这种方法比较底层,需要对处理器架构有深入的了解。

五、如何解决伪共享

  1. 变量对齐与填充
    • 对齐关键字:在定义共享变量时,使用对齐关键字(如 C++ 中的 alignas)确保每个变量的起始地址位于新的缓存行的起始位置。例如,对于 64 字节缓存行的系统,可以将变量声明为 alignas(64),这样每个变量都独占一个缓存行,避免了伪共享。
    • 手动填充:如前面提到的在共享变量之间添加填充字节,手动保证它们不会处于同一个缓存行中。这种方法简单有效,但会增加内存的使用量。在一些对内存敏感的场景下,需要权衡是否采用这种方法。
  2. 使用线程本地存储(Thread-Local Storage, TLS):如果某些数据只被单个线程访问,那么可以将这些数据存储在每个线程的本地存储中,避免与多个线程共享的变量处于同一个缓存行。例如,在一些计算密集型任务中,可以使用线程本地变量来存储中间结果,减少线程间的缓存干扰。
  3. 优化数据结构布局:重新设计数据结构,使经常一起被访问的元素在内存中更加紧凑,减少它们被分散到不同缓存行的可能性。例如,如果一个多线程程序频繁访问结构体数组中的多个成员,可以将这些成员在结构体中的布局进行优化,使得多个结构体的相关成员更有可能位于同一个缓存行中,从而减少缓存行无效化的开销。
  4. 采用无锁数据结构:无锁数据结构通过使用原子操作和内存屏障等机制来实现线程间的同步,而无需传统的锁机制。这种方式可以减少因锁竞争和缓存行同步导致的性能损失。同时,一些无锁数据结构在设计上也会充分考虑缓存行的使用,以减少伪共享的问题。

六、结论

伪共享是一个在多线程编程和共享内存系统中需要引起重视的问题。了解伪共享的概念、危害以及定位和解决方法,可以帮助开发人员在编写高效的并发程序时避免陷入性能瓶颈。通过合理使用性能分析工具、优化代码结构、采用合适的同步机制等方法,可以有效地解决伪共享问题,充分发挥多线程程序的性能潜力。未来,随着计算机硬件架构的不断发展和多线程技术的广泛应用,对伪共享问题的研究和优化将变得更加重要。

相关文章:

C++多线程编程时的伪共享问题及其定位和解决

一、引言 在多线程编程和共享内存系统中&#xff0c;为了提高程序性能&#xff0c;常常需要对共享数据进行处理。然而&#xff0c;在并发环境下&#xff0c;一种名为“伪共享&#xff08;False Sharing&#xff09;”的问题可能会悄然出现&#xff0c;它虽然不像传统的多线程同…...

高并发短信系统设计:基于SharingJDBC的分库分表、大数据同步与实时计算方案

高并发短信系统设计&#xff1a;基于SharingJDBC的分库分表、大数据同步与实时计算方案 一、概述 在当今互联网应用中&#xff0c;短信服务是极为重要的一环。面对每天发送2000万条短信的需求&#xff0c;我们需要一个能够处理海量数据&#xff08;一年下来达到数千万亿级别&…...

【HTML】html文件

HTML文件全解析&#xff1a;搭建网页的基石 在互联网的广袤世界里&#xff0c;每一个绚丽多彩、功能各异的网页背后&#xff0c;都离不开HTML文件的默默支撑。HTML&#xff0c;即超文本标记语言&#xff08;HyperText Markup Language&#xff09;&#xff0c;作为网页创建的基…...

5.11 GitHub API调试五大高频坑:从JSON异常到异步阻塞的实战避坑指南

GitHub API调试五大高频坑:从JSON异常到异步阻塞的实战避坑指南 关键词:GitHub API 调试、JSON 解析异常、提示工程优化、异步任务阻塞、数据清洗策略 5.5 测试与调试:调试常见问题 问题1:GitHub API 调用异常 现象: requests.exceptions.HTTPError: 403 Client Error…...

协程的原生挂起与恢复机制

目录 &#x1f50d; 一、从开发者视角看协程挂起与恢复 &#x1f9e0; 二、协程挂起和恢复的机制原理&#xff1a;核心关键词 ✅ suspend 函数 ≠ 普通函数 ✅ Continuation&#xff08;协程的控制器&#xff09; &#x1f527; 三、编译器做了什么&#xff1f;&#xff0…...

机器学习中的数学(PartⅡ)——线性代数:2.2矩阵

概述 本节内容也相对简单&#xff0c;首先介绍了矩阵的定义&#xff0c;矩阵的表示方法&#xff1b;然后介绍了矩阵的加法和乘法&#xff0c;与标量的乘法&#xff0c;以及一些矩阵相关算数运算的性质&#xff0c;包括满足结合律、交换律&#xff1b;矩阵的逆和转置&#xff1…...

泉涌未来:科技与生态的共生诗篇-济南

故事背景 故事发生在中国山东济南的未来城市环境&#xff0c;这里不再是单纯的自然景观与现代建筑的堆砌&#xff0c;而是科技与生态深度融合的奇妙世界。泉水&#xff0c;这一济南的灵魂元素&#xff0c;在未来科技的赋能下&#xff0c;成为连接城市各个角落的纽带。量子态泉水…...

用AI生成系统架构图

DeepSeek+Drawio+SVG绘制架构图-找到一种真正可行实用的方法和思路 1、使用DeepSeek生成SVG文件,导入drawio工具的方法 🔥 问题根源分析 错误现象: • 导入时报错包含 data:image/SVG;base64 和 %20 等 URL 编码字符 • 代码被错误转换为 Base64 格式(适用于网页嵌入,但…...

网络基础1

目录 初识协议 协议分层 软件分层的好处 OSI七层模型 TCP/IP 五层(或四层)模型 再谈协议 为什么要有 TCP/IP 协议&#xff1f; TCP/IP 协议与操作系统的关系 所以究竟什么是协议&#xff1f; 网络传输基本流程 认识 MAC 地址 局域网(以太网为例)通信原理 报文的传…...

免费且好用的PDF水印添加工具

软件介绍 今天要给大家推荐一款超实用的PDF添加水印工具&#xff0c;它能够满足用户给PDF文件添加水印的需求&#xff0c;而且完全免费。 这款PDF添加水印的软件有着简洁的界面&#xff0c;操作简便&#xff0c;无需安装&#xff0c;解压后即可使用。 在使用前&#xff0c;先…...

C++Primer对象移动

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…...

互联网三高-数据库高并发之分库分表ShardingJDBC

1 ShardingJDBC介绍 1.1 常见概念术语 ① 数据节点Node&#xff1a;数据分片的最小单元&#xff0c;由数据源名称和数据表组成 如&#xff1a;ds0.product_order_0 ② 真实表&#xff1a;再分片的数据库中真实存在的物理表 如&#xff1a;product_order_0 ③ 逻辑表&#xff1a…...

七、自动化概念篇

自动化测试概念 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常&#xff0c;在设计了测试用例并通过评审之后&#xff0c;由测试人员根据测试用例中描述的过程一步步执行测试&#xff0c;得到实际结果与期望结果的比较。在此过程中&#xff0c;为了节省人…...

python操作mongodb

1、安装包 pyMongo是MongoDB官方推荐的Python驱动程序&#xff0c;它提供了访问MongoDB数据库所需的接口。安装PyMongo非常简单&#xff0c;可以通过pip包管理工具来安装最新版本&#xff1a; pip install pymongo 安装完成后&#xff0c;我们可以使用以下Python代码来检查是否…...

IS-IS中特殊字段——OL过载

文章目录 OL 过载位 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Datacom专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2025年04月13日20点12分 OL 过载位 路由过载 使用 IS-IS 的过载标记来标识过载状态 对设备设置过载标记后&#xff…...

行星际激波在日球层中的传播:Propagation of Interplanetary Shocks in the Heliosphere (第二部分)

行星际激波在日球层中的传播&#xff1a;Propagation of Interplanetary Shocks in the Heliosphere &#xff08;第一部分&#xff09;-CSDN博客 Propagation of Interplanetary Shocks in the Heliosphere [ Chapter 3 ] [PDF: arXiv] 本文保留原文及参考文献&#xff0c;参…...

紫光同创FPGA实现HSSTLP光口视频点对点传输,基于Aurora 8b/10b编解码架构,提供6套PDS工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目紫光同创FPGA相关方案推荐我这里已有的 GT 高速接口解决方案Xilinx系列FPGA实现GTP光口视频传输方案推荐Xilinx系列FPGA实现GTX光口视频传输方案推荐Xilinx系列FPGA实…...

正则表达式使用知识(日常翻阅)

正则表达式使用 一、字符匹配 1. 普通字符 描述&#xff1a;直接匹配字符本身。示例&#xff1a; abc 匹配字符串中的 “abc”。Hello 匹配字符串中的 “Hello”。 2. 特殊字符 .&#xff08;点号&#xff09;&#xff1a; 描述&#xff1a;匹配任意单个字符&#xff08;…...

CSS padding(填充)学习笔记

CSS 中的 padding&#xff08;填充&#xff09;是一个非常重要的属性&#xff0c;它用于定义元素边框与元素内容之间的空间&#xff0c;即上下左右的内边距。合理使用 padding 可以让页面布局更加美观、清晰。以下是对 CSS padding 的详细学习笔记。 一、padding 的作用 padd…...

Python中的字符串、列表、字典和集合详解

Python是一门强大的编程语言&#xff0c;其内置的数据结构丰富多样。其中&#xff0c;字符串、列表、字典和集合是最常用的数据类型。本文将对它们的区别、用法和使用场景进行详细介绍&#xff0c;帮助大家更好地理解和应用这些数据结构。 1. 字符串&#xff08;String&#xf…...

【CUDA编程】CUDA Warp 与 Warp-Python 对比文档

相关文档: Nvidia-Warp GitHub&#xff1a;nvidia/warp CUDA Warp 和 Warp-Python 库 的对比与统一文档&#xff0c;涵盖两者的核心概念、区别、使用场景及示例&#xff1a; 1. CUDA Warp&#xff08;硬件/编程模型概念&#xff09; 1.1 定义与核心概念 定义&#xff1a; C…...

中厂算法岗面试总结

时间&#xff1a;2025.4.10 地点&#xff1a;上市的电子有限公司 面试流程&#xff1a; 1.由负责人讲解公司文化 2&#xff0c;由技术人员讲解公司的技术岗位&#xff0c;还有成果 3.带领参观各个工作位置&#xff0c;还有场所 4.中午吃饭 5.面试题&#xff0c;闭卷考试…...

Losson 4 NFS(network file system(网络文件系统))

网络文件系统&#xff1a;在互联网中共享服务器中文件资源。 使用nfs服务需要安装:nfs-utils 以及 rpcbind nfs-utils : 提供nfs服务的程序 rpcbind &#xff1a;管理nfs所有进程端口号的程序 nfs的部署 1.客户端和服务端都安装nfs-utils和rpcbind #安装nfs的软件rpcbind和…...

自动化运行后BeautifulReport内容为空

一、问题描述 自动化程序运行后发现运行目录下生成的html报告文件内容为空&#xff0c;没有运行结果。 二、测试环境 操作系统&#xff1a;Windows 11 家庭版BeautifulReport&#xff1a;0.1.3Python&#xff1a;3.11.9Appium-Python-Client&#xff1a;5.0.0Appium Server:2.…...

CTF-WEB排行榜制作

CTF-WEB排行榜制作 项目需求&#xff1a; 现在14道题对应有14个flag&#xff0c;我需要使用dockerfile搭建一个简单的&#xff0c;能够实现验证这些题目对应的flag来计分的简单网站&#xff08;要求页面比较精美&#xff09; 前十题设置为10分 11-14题设置为20分 1. flag{5a3…...

架构生命周期(高软57)

系列文章目录 架构生命周期 文章目录 系列文章目录前言一、软件架构是什么&#xff1f;二、软件架构的内容三、软件设计阶段四、构件总结 前言 本节讲明架构设计的架构生命周期概念。 一、软件架构是什么&#xff1f; 二、软件架构的内容 三、软件设计阶段 四、构件 总结 就…...

STM32单片机定时器的输入捕获和输出比较

目录 一、定时器的输入捕获 1、工作原理 2、示例代码 二、定时器的输出比较 1、工作原理 2、示例代码 三、总结 在STM32单片机中&#xff0c;定时器是一个非常重要的外设&#xff0c;广泛应用于时间管理、事件计时、波形生成等多种场景。其中输入捕获和输出比较是两个基…...

计算机组成原理-系统总线

1. 系统总线的定义 系统总线是计算机系统中各功能部件&#xff08;CPU、存储器、I/O设备等&#xff09;之间传递信息的公共通路&#xff0c;遵循统一的电气规范和时序协议&#xff0c;是计算机硬件互联的基础。 核心作用&#xff1a;实现数据、地址和控制信号的传输&#xff…...

【android bluetooth 框架分析 02】【Module详解 3】【HciHal 模块介绍】

1. 背景 我们在 gd_shim_module 介绍章节中&#xff0c;看到 我们将 HciHal 模块加入到了 modules 中。 modules.add<hal::HciHal>();在 ModuleRegistry::Start 函数中我们对 加入的所有 module 挨个初始化。 而在该函数中启动一个 module 都要执行那下面几步&#xff…...

Git 远程仓库

Git 入门笔记 远程仓库 Git 远程仓库 Git 远程仓库是一个托管在网络服务器上的代码仓库&#xff0c;它是团队协作开发的核心。 通过远程仓库&#xff0c;开发者可以共享代码、同步更新&#xff0c;实现分布式协作。 SSH 密钥 SSH 密钥可以让你在使用 Git 时安全地连接远程…...

209.长度最小的子数组- 力扣(LeetCode)

题目&#xff1a; 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 示例 1&#xff1a;…...

符号右移“ >>= “ 与 无符号右移“ >>>= “ 的区别

符号右移" >> " 与 无符号右移" >>> " 的区别 一、符号右移" >> " 与 无符号右移" >>> " 的区别1. 符号右移&#xff08;>>&#xff09;与无符号右移&#xff08;>>>&#xff09;的区别…...

山东大学软件学院项目实训-基于大模型的模拟面试系统-专栏管理部分

本周我的主要任务是关于专栏管理部分的完善。 专栏图片的显示问题 问题分析 根据代码可知&#xff1a;图片URL来自于portfolio.headImgUrl&#xff0c;而且如果URL不存在的话&#xff0c;应该显示的是无图片&#xff0c;而网页中显示加载失败说明portfolio.headImgUrl应该是存…...

从 SYN Flood 到 XSS:常见网络攻击类型、区别及防御要点

常见的网络攻击类型 SYN Flood、DoS&#xff08;Denial of Service&#xff09; 和 DDoS&#xff08;Distributed Denial of Service&#xff09; 是常见的网络攻击类型&#xff0c;它们的目标都是使目标系统无法正常提供服务。以下是它们的详细说明&#xff1a; 1. SYN Flood…...

ros2-rviz2控制unity仿真的6关节机械臂,探索从仿真到实际应用的过程

文章目录 前言&#xff08;Introduction&#xff09;搭建开发环境&#xff08;Setup Development Environment&#xff09;在window中安装Unity&#xff08;Install Unity in window&#xff09;创建Docker容器&#xff0c;并安装相关软件&#xff08;Create Docker containers…...

01_通过调过api文字生成音频示例

第1 第2 第3&#xff0c;测试音色 第4 第5 第6 第7生成api_key 第8代码 import requestsurl "https://api.siliconflow.cn/v1/audio/speech"payload {"input": "在中国传统文化中&#xff0c;谦让被视为一种美德&#xff0c;但过度的让步…...

使用PyTorch实现目标检测边界框转换与可视化

一、引言 在目标检测任务中&#xff0c;边界框&#xff08;Bounding Box&#xff09;的坐标表示与转换是核心基础操作。本文将演示如何&#xff1a; 实现边界框的两种表示形式&#xff08;角点坐标 vs 中心坐标&#xff09;之间的转换 使用Matplotlib在图像上可视化边界框 验…...

QEMU学习之路(8)— ARM32通过u-boot 启动Linux

QEMU学习之路&#xff08;8&#xff09;— ARM32通过u-boot 启动Linux 一、前言 参考文章&#xff1a; Linux内核学习——内核的编译和启动 Linux 内核的编译和模拟执行 Linux内核运行——根文件系统 Linux 内核学习——使用 uboot 加载内核 二、构建Linux内核 1、获取Linu…...

flutter 桌面应用之右键菜单

​在 Flutter 桌面应用开发中&#xff0c;context_menu 和 contextual_menu 是两款常用的右键菜单插件&#xff0c;各有特色。以下是对它们的对比分析&#xff1a;​ &#x1f9e9; context_menu 集成方式&#xff1a;​通过 ContextMenuArea 组件包裹目标组件&#xff0c;定义…...

系统设计面试总结:高性能相关:CDN(内容分发网络)、什么是静态资源、负载均衡(Nginx)、canal、主从复制

以下为本人自学回顾使用&#xff0c;请支持javaGuide原版。 1.CDN概述 CDN 就是将静态资源分发到多个不同的地方以实现就近访问&#xff0c;进而加快静态资源的访问速度&#xff0c;减轻服务器以及带宽的负担。 你可以将 CDN 看作是服务上一层的特殊缓存服务&#xff0c;分布…...

从红黑树到哈希表:原理对比与典型场景应用解析(分布式以及布隆过滤器)

在数据结构的世界里&#xff0c;红黑树一直以「自平衡二叉查找树」的身份备受赞誉。凭借红黑节点的精妙设计&#xff0c;它能将插入、删除、查找的时间复杂度稳定控制在 ( log ⁡ n ) (\log n) (logn)&#xff0c;成为处理有序数据的经典方案。然而&#xff0c;当业务场景对「…...

动手学深度学习:手语视频在VGG模型中的测试

前言 其他所有部分同上一篇AlexNet一样&#xff0c;所以就不再赘诉&#xff0c;直接看VGG搭建部分。 模型 VGG是第一个采取块进行模块化搭建的模型。 def vgg_block(num_convs,in_channels,out_channels):layers[]for _ in range(num_convs):layers.append(nn.Conv2d(in_ch…...

微信小程序实战案例 - 餐馆点餐系统 阶段 4 - 订单列表 状态

✅ 阶段 4 – 订单列表 & 状态 目标 展示用户「我的订单」列表支持状态筛选&#xff08;全部 / 待处理 / 已完成&#xff09;支持分页加载和实时刷新使用原生组件编写 ✅ 1. 页面结构&#xff1a;文件结构 pages/orders/├─ index.json├─ index.wxml├─ index.js└─…...

深度学习理论-直观理解 Attention

本文首先介绍 Attention 的原始公式&#xff0c;然后以 Self-Attention 为例&#xff0c;简化后逐步分析 Attention 计算结果表达的含义 Attention Attention 公式如下&#xff1a; A t t e n t i o n s o f t m a x ( Q ⋅ K T d k ) ⋅ V Attention softmax(\frac{Q \cd…...

python中 “with” 关键字的取舍问题

自动管理资源&#xff08;自动关闭文件&#xff09; 当你使用 with 打开文件时&#xff0c;文件会在 with 代码块结束后自动关闭&#xff0c;无论是否发生异常。这意味着你不需要显式地调用 f.close() 来关闭文件 示例&#xff1a; with open("words.txt", "r…...

ISIS协议(动态路由协议)

ISIS基础 基本概念 IS-IS&#xff08;Intermediate System to Intermediate System&#xff0c;中间系统到中间系统&#xff09;是ISO &#xff08;International Organization for Standardization&#xff0c;国际标准化组织&#xff09;为它的CLNP&#xff08;ConnectionL…...

llm开发框架新秀

原文链接:https://i68.ltd/notes/posts/20250404-llm-framework3/ google开源ADK-Agent Development Kit 开源的、代码优先的 Python 工具包&#xff0c;用于构建、评估和部署具有灵活性和控制力的复杂智能体项目仓库:https://github.com/google/adk-python 2.6k项目文档:Age…...

Zookeeper的典型应用场景?

大家好&#xff0c;我是锋哥。今天分享关于【Zookeeper的典型应用场景?】面试题。希望对大家有帮助&#xff1b; Zookeeper的典型应用场景? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 ZooKeeper 是一个开源的分布式协调服务&#xff0c;主要用于管理和协调大…...

【C数据结构】 TAILQ双向有尾链表的详解

TAILQ双向有尾链表的详解 常见的链表结构1.SLIST2.STAILQ3.LIST4.TAILQ5.CIRCLEQ 一、TAILQ链表简介二、TAILQ的定义和声明三、TAILQ队列的函数1.链表头的初始化2.获取第一个节点地址3.获取最后一个节点地址4.链表是否为空5.下一个节点地址6.上一个节点地址7.插入头节点8.插入尾…...

redisson的unlock方法

//分布式方式&#xff0c;分布式锁&#xff0c;采用redisson锁 RLock lock redissonClient.getLock(userId.toString());//lock方法会无限重试。getLock底层是hash&#xff0c;大key是userid&#xff0c;小key是线程&#xff0c;value是重入次数 try {//boolean b lock.tryLo…...