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

C++多线程中errno变量是线程安全的吗

夜雪大大_3332

夜雪大大_3332

发布时间:2026-08-05 15:09:27

|

493人浏览过

|

来源于php中文网

原创

errno在C++多线程中是线程安全的,现代POSIX系统(如Linux、macOS)和主流C++标准库将其实现为线程局部宏(如glibc中定义为(*__errno_location())),C++11标准也明确要求其具有线程局部存储期;但需立即读取,避免被同一线程内后续调用覆盖。

c++多线程中errno变量是线程安全的吗

errno 在 C++ 多线程中确实是线程安全的

现代 POSIX 兼容系统(Linux、macOS)和主流 C++ 标准库(libstdc++、libc++)中,errno 不是传统意义上的全局变量,而是通过宏展开为线程局部访问:例如在 glibc 中定义为 (*__errno_location()),每次读写都指向当前线程私有的存储位置。C++11 标准也明确要求 errno 具有线程局部存储期(thread-local storage duration),所以你无需额外加锁或封装就能在多线程中直接使用。

但“线程安全”不等于“可随意延迟检查”

即便每个线程有自己的 errno,它仍极易被**同一线程内后续的函数调用覆盖**。常见错误是:在系统调用失败后没立刻读取 errno,中间穿插了其他库函数(如 printf、malloc、甚至 strerror 自身),导致拿到的是无关错误码。

  • ✅ 正确做法:在判断函数返回值失败后,**立即**读取 errno,不要跨语句、不要跨函数调用
  • ❌ 错误模式:if (fd == -1) { log_error(); printf("err: %d", errno); } —— log_error() 或 printf 可能已改写 errno
  • ⚠️ 注意:perror 和 strerror(errno) 内部会读取并使用 errno,但它们本身也可能触发其他系统调用(如 write),因此也不建议在它们之后再依赖 errno 值

Windows 与 MinGW 的兼容性差异

Windows 上的 MSVC 运行时通过 (*_errno()) 实现线程局部 errno,行为与 Linux 一致;但 MinGW-w64 默认启用 POSIX 兼容模式,同样安全。不过,如果你手动链接旧版 MinGW 或启用非 POSIX 模式,errno 可能退化为全局变量——此时多线程下会出错。

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载
  • ✅ 安全前提:确保编译时定义了 _POSIX_THREAD_SAFE_FUNCTIONS(通常由工具链自动处理)
  • ? 验证方式:运行时打印 sizeof(errno) 没有意义,但可检查 &errno != &((void(*)())0, errno) 是否恒成立(实际应比较地址稳定性),更可靠的是查阅目标平台 errno.h 中的宏定义
  • ? 提示:跨平台项目中,若需绝对可控,可立即将失败后的 errno 保存到局部变量,如 int saved_errno = errno;,后续只用该副本

真正容易被忽略的点:信号处理函数中的 errno

在自定义信号处理函数(如 sigaction 注册的 handler)中,errno 的行为是未定义的——即使主线程中安全,信号中断上下文可能破坏其线程局部状态。POSIX 明确指出:信号处理函数中不应依赖 errno 值,除非你确认所用系统对此做了特殊保证(glibc 从 2.29 起在部分 handler 中保留 errno,但不可移植)。

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

  • ? 切勿在 signal handler 中直接使用 errno 判断错误原因
  • ✅ 替代方案:在主循环中用 signalfd(Linux)或 sigwaitinfo 同步接收信号,并在安全上下文中检查错误
  • ⚠️ 补充:write 等异步信号安全函数(async-signal-safe)允许在 handler 中调用,但它们**不设置 errno**;若需记录错误,必须提前把 errno 保存到 static __thread 变量中(注意初始化和竞态)

热门AI工具

更多
豆包大模型

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

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

切问学术

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

VibeKnow
VibeKnow Hot

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

WorkBuddy

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

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

DeepSeek

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

SkildArt
SkildArt Hot

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

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2208

2024.03.14

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

979

2024.03.14

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

407

2024.03.14

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

307

2024.03.14

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

386

2024.03.14

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

580

2024.03.14

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

1389

2024.03.21

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

1197

2024.03.22

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

80

2026.09.30

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习

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

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