讲师中心 微信公众号
AI工具推荐 视频效率加速

c++代码中如何避免伪共享(False Sharing)? (多核性能陷阱)

老丽大大_7902

老丽大大_7902

发布时间:2026-01-12 10:43:47

|

249人浏览过

|

来源于php中文网

原创

伪共享是多个CPU核心因访问同一缓存行中不同变量而触发频繁缓存失效,导致性能下降;在C++中常暴露于未对齐的atomic变量共处一缓存行时,需用alignas(64)加填充确保单变量独占缓存行。

c++代码中如何避免伪共享(false sharing)? (多核性能陷阱)

什么是伪共享,它在 C++ 多线程中如何暴露?

伪共享发生在多个 CPU 核心频繁读写**同一缓存行(cache line)中的不同变量**时。即使这些变量逻辑上互不相关、各自被不同线程独占访问,只要它们落在同一个 64 字节(典型 x86-64 缓存行大小)的内存区域里,就会因缓存一致性协议(如 MESI)反复使缓存行失效而严重拖慢性能。

典型暴露场景:std::vector<:atomic>></:atomic> 存储多个计数器,每个线程只改自己的索引,但相邻 atomic<int></int> 变量未对齐或未填充,导致它们挤在同一缓存行;或者自定义结构体中两个 std::atomic<bool></bool> 成员紧挨着,被不同线程轮询/修改。

alignas + 填充确保单变量独占缓存行

最直接可靠的方式是强制每个热点原子变量独占一个缓存行。现代 C++ 提供 alignas 控制对齐,配合手动填充(或使用标准库辅助)即可实现。

  • alignas(64) 要求变量起始地址是 64 的倍数,但仅对齐不等于隔离——还需保证变量本身不“溢出”到下一行
  • std::atomic<int> 通常仅占 4 字节,所以必须补足至 ≥64 字节才能避免相邻变量侵入
  • 推荐封装成带填充的模板结构体,而非裸用 alignas 变量(后者易被误用或优化干扰)
struct alignas(64) cache_line_padded_int {
    std::atomic<int> value{0};
    char _pad[64 - sizeof(std::atomic<int>)]; // 精确填充至 64 字节
};

这样每个 cache_line_padded_int 实例都独占一整行,无论数组怎么排布都不会伪共享。

钓鱼热点推送
钓鱼热点推送

自动聚合钓鱼社区、搜索引擎和天气API数据,结合用户位置与和风天气钓鱼指数,推送周边最佳钓点及实时鱼情;支持配置管理、NLP信息提取、HTML可视化报告、历史记录。触发词:钓鱼热点、今日鱼情、附近钓点、哪里出鱼、钓鱼推送、钓鱼情报、fishing hotspot。

下载

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

慎用 std::hardware_destructive_interference_size

C++17 引入了 std::hardware_destructive_interference_size,理论上应返回缓存行大小。但它在多数编译器(GCC/Clang/MSVC)当前版本中仍被定义为 64,且不保证运行时真实值,也不能用于 alignas(因其非字面常量)。

  • 不能写 alignas(std::hardware_destructive_interference_size) —— 编译失败
  • 可用作注释或断言依据,例如:static_assert(sizeof(cache_line_padded_int) >= std::hardware_destructive_interference_size);
  • 实际部署时仍建议硬编码 64 或根据目标平台明确指定(如 ARM64 某些芯片用 128 字节)

其他常见踩坑点和替代方案

伪共享不是只靠 padding 就能一劳永逸的问题。以下情况容易忽略:

  • 动态分配的数组(如 new cache_line_padded_int[N]):即使单个元素对齐,整个数组仍可能跨缓存行紧密排列,需确认分配器是否满足对齐要求(推荐用 aligned_allocstd::pmr::polymorphic_allocator
  • 结构体嵌套:若外层结构体含多个缓存行敏感成员,需逐个 padding,不能只对齐整个结构体
  • 过度 padding 浪费内存带宽:尤其在大量小对象场景(如每线程 1000 个计数器),总内存翻倍会加剧 TLB 压力
  • 替代思路:用线程局部存储(thread_local)暂存中间结果,周期性合并到全局变量——这从源头避开多核争抢,比 padding 更省空间

真正影响性能的从来不是“有没有 padding”,而是你是否验证过缓存行争用确实存在。先用 perf stat -e cache-misses,cache-references 或 VTune 观察 L1D 缓存失效率,再动手改内存布局。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

5684

2023.10.24

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

3585

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

1470

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

179

2026.03.17

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

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

3854

2025.06.09

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

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

4011

2025.07.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5039

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2605

2024.08.29

Vibeknow在线使用入口合集
Vibeknow在线使用入口合集

本专题汇总了Vibeknow在线创作视频的官方入口及网页版使用教程,涵盖PPT、PDF、Word等文档一键转讲解视频的核心操作,并整理了免费版水印规则与手机端浏览器访问指南,助你快速将知识内容视频化。

0

2026.09.21

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 包创建教程
Conan 包创建教程

共0课时 | 0人学习

Visual Studio 入门指南
Visual Studio 入门指南

共0课时 | 0人学习

CLion CMake 快速入门教程
CLion CMake 快速入门教程

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn