0

0

c++什么是伪共享 c++多核CPU缓存问题详解【并发】

尼克

尼克

发布时间:2025-12-23 15:08:39

|

920人浏览过

|

来源于php中文网

原创

伪共享是多核CPU中因变量同处一缓存行引发的无效缓存同步现象;缓存行通常64字节,线程写入任一变量即导致整行失效并触发MESI协议开销,需通过perf工具识别并用alignas或padding隔离变量。

c++什么是伪共享 c++多核cpu缓存问题详解【并发】

伪共享(False Sharing)是多核 CPU 上因缓存行对齐不当导致的性能陷阱:多个线程修改不同变量,却因它们落在同一缓存行而频繁触发缓存同步,白白消耗带宽和时间。

缓存行与伪共享怎么发生的

CPU 缓存不是按字节管理,而是以固定大小的“缓存行”(Cache Line)为单位加载数据,常见大小为 64 字节。当两个变量物理地址落在同一缓存行内,即使被不同线程独占访问,只要任一线程写入,整个缓存行就会被标记为“已修改”。其他核上该行副本随即失效——下次读取必须重新从内存或其它核同步,引发不必要的缓存一致性协议开销(如 MESI 状态切换)。

例如:

  • 结构体中两个 bool 成员紧挨着定义:struct { bool a; bool b; };
  • 线程 A 修改 a,线程 B 同时修改 b
  • ab 落在同一 64 字节缓存行,两者会互相“干扰”,性能可能下降数倍

如何识别伪共享

不能靠肉眼判断,需结合工具和模式分析:

立即学习C++免费学习笔记(深入)”;

Question AI
Question AI

一款基于大模型的免费的AI问答助手、总结器、AI搜索引擎

下载
  • 使用 perf(Linux)观察 cache-missesmem_load_retired.l1_missl2_rqsts.rejected_sw_pfq 等事件突增
  • 关注高并发下单个核心利用率低但整体吞吐上不去,且变量访问无真正共享逻辑
  • __builtin_assume_aligned 或调试器检查变量地址,确认是否同属一个 64 字节区间(地址 & ~63 相同)

常用规避方法

核心思路是让高频写入的变量独占缓存行:

  • 手动填充(Padding):在变量前后插入足够字节(如 64 - sizeof(T)),确保它独占一行。C++17 可用 alignas(64) 配合 char 数组实现
  • 使用 alignas(64) + 独立变量:将热点变量声明为独立全局/静态变量,并强制对齐到缓存行边界
  • 避免结构体内混放热字段:把会被不同线程写的字段拆到不同结构体,或用 [[no_unique_address]](C++20)配合填充控制布局
  • 用 std::hardware_destructive_interference_size(C++17):标准提供的推荐缓存行隔离尺寸(通常为 64),用于 padding 计算更可移植

伪共享不是万能优化点

它只在特定场景显著影响性能:

  • 高频率写入(如计数器、标志位)
  • 变量被不同物理核上的线程同时修改
  • 缓存行竞争成为瓶颈(可通过 perf 确认)

盲目加 padding 会浪费内存、降低 L1 缓存利用率,甚至影响预取效果。应在性能剖析确认问题后再针对性处理。

相关专题

更多
golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

196

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

187

2025.07.04

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

196

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

187

2025.07.04

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

480

2023.08.10

css中的padding属性作用
css中的padding属性作用

在CSS中,padding属性用于设置元素的内边距。想了解更多padding的相关内容,可以阅读本专题下面的文章。

131

2023.12.07

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1348

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

701

2023.06.29

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

8

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.2万人学习

Git 教程
Git 教程

共21课时 | 2.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号