文章目录MinGW的thread model和runtime一、线程模型thread model原理gthr1posixwinpthreads模型【最常用MSYS2 mingw64 默认】2win32 线程模型3补充mcfmcfgthreadGCC13快速对比表查看当前工具链线程模型二、Runtime运行时库拆分MinGW 有两套 runtimeA. Microsoft CRTC标准库Windows原生B. GCC RuntimeGNU 运行时mingw-w64 自带Runtime 版本匹配铁律非常关键三、典型调用链路posix model四、选型建议工程上MinGW的thread model和runtimethread model 是 GCC/libstdc/libgcc 内部用哪一套底层线程原语gthr来实现 C11 std::thread、thread_local、异常安全、static 初始化等不是限制你代码能不能调用 Win32 CreateThread / pthread APImingw-w64 主流两个posixwinpthreads、win32还有较新的mcfmcfgthreadGCC13runtime 分两块微软CRTucrt/msvcrt GCC runtimelibgcc, libstdc, libwinpthreads, libgomp…参考 WinLibs standalone build of GCC and MinGW-w64 for Windows一、线程模型thread model原理gthrGCC 有一层抽象层gthrGNU threadslibstdc、libgcc 的线程安全逻辑全部走 gthrgthr-posix后端绑定 pthreadmingw-w64 上就是 winpthreadsgthr-win32后端直接调用 Win32 native APICreateThread、SRWLock、CondVar 等⚠️ 重点模型是编译工具链时就定死的不是编译单个程序时选的你下的 MSYS2 / WinLibs 包是预先编译好的 posix / win32 版本gcc -v能看到Thread model: posix1posixwinpthreads模型【最常用MSYS2 mingw64 默认】底层库libwinpthreadsmingw-w64 自己实现的 pthread 层跑在 Win32 API 之上✅ 支持完整 C11/17std::thread, std::mutex, std::condition_variable, std::future, thread_localC11threads.h可用✅ 适合移植 Unix/Linux 代码、跨平台项目、QtQt for MinGW 默认 posix✅ 你代码里依然可以直接调用 CreateThread但要注意GCC runtime 的 TLS、static 构造/析构、exception cleanup 是按 winpthreads 的线程生命周期管理如果你自己 CreateThread这个新线程对 libwinpthreads 是“外部线程”某些 pthread TLS destructor、atexit 逻辑不会跑容易资源泄漏、undefined behavior❗ 分发动态链接时依赖libwinpthreads-1.dll可以-static-libwinpthread静态打包进去实现路径std::thread→ gthr-posix → winpthreads → Win32 CreateThread/Semaphore/ConditionVariable2win32 线程模型底层直接原生 Win32 API不依赖 libwinpthreads.dll❌传统 win32 模型默认禁用 std::thread / C11 线程设施老版本几乎不能用 std::thread新版 GCC 虽然有补丁支持 libstdc threads但社区成熟度低、坑多、很多预编译包没开这个 feature✅ 无额外 pthread dll 依赖轻量纯 Windows 原生程序、只手写 CreateThread 的场景适合✅ 异常、libgcc 的线程安全逻辑直接基于 Win32 TLS❌ 不兼容 pthread 代码移植很多第三方库boost、Qt、ffmpeg都是针对 posix 模型编译的混链直接崩 ABI坑win32 model 的 TLS destructor 行为不符合 POSIX进程退出时才调用而不是线程退出时调用标准一致性差3补充mcfmcfgthreadGCC13新模型直接基于 Win32 内核原语重新实现 gthr不包装 pthread标准合规性、性能优于 winpthreads无 winpthreads dll但生态还小很多库没有 mcf 版本快速对比表模型std::thread依赖dll底层适用场景posix(winpthreads)✅ 完整libwinpthreads-1.dll动态winpthreads封装Win32跨平台、Qt、移植Linux代码绝大多数项目win32❌老版本有限支持新版本无直接Win32 API纯Windows、不使用std::thread、最小依赖mcf✅无mcfgthread原生Win32GCC13追求性能标准合规查看当前工具链线程模型gcc -v # 输出里Thread model: posix / win32一个高频误区“我用 posix 模型是不是不能调用 Win32 API”不是。Win32 API 永远都能调用风险是 runtimelibgcc/libstdc的线程上下文管理不感知你原生 CreateThread 创建的线程。反过来 win32 model 你也可以 link libwinpthreads 手动调 pthread_create但 runtime gthr 层不配套非常危险。二、Runtime运行时库拆分MinGW 有两套 runtimeA. Microsoft CRTC标准库Windows原生mingw-w64 只是封装微软自带 CRT 的头和导入库分两代MSVCRT老 msvcrt.dll系统自带Windows XP~7ABI 固定C89C99支持残缺旧 mingw32 默认UCRTUniversal CRTucrtbase.dllVS2015引入Win10自带完整C99、C11mingw-w64 12 默认 UCRTMSYS2 UCRT64 环境就是这个CRT 负责printf, malloc, fopen, errno, atexit, signal、进程启动入口mainCRTStartup、C TLS区分ucrt64UCRTmingw64MSVCRT老B. GCC RuntimeGNU 运行时mingw-w64 自带这才是和 thread model 强绑定的部分libgcc最低层。整数软浮点、栈展开exception unwind、thread_local底层支持、static 一次性初始化guard、gthr 对接。线程模型直接编译进 libgcc这是为什么 posix / win32 工具链不能混链接的核心原因。libstdcC标准库STLstd::thread, std::mutex, std::vector内部通过 gthr 调用 libgcc 的线程原语。libwinpthreadsposix model 专属pthread API 实现层。libgompOpenMP runtime也依赖工具链的 thread model。libatomic / libquadmath辅助库。链接选项含义-static-libgcc静态链接 libgcc-static-libstdc静态链接 libstdc-static-libwinpthread静态打包 winpthreads不再依赖 libwinpthreads-1.dllRuntime 版本匹配铁律非常关键CRT 版本 thread model exception modelSEH/Dwarf三者必须整套一致所有依赖库都要用同一个工具链编译不能交叉混用例posixSEHUCRT 的 gcc不能链接一个 win32DwarfMSVCRT 编译出来的 .a/.dllABI 不兼容、随机崩溃、死锁、TLS 泄漏。Exception model 顺带一提经常和 thread model 一起被问SEHWindows 原生结构化异常64位 mingw-w64 默认DwarfDWARF unwind32位常用基于libgcc的异常栈展开三、典型调用链路posix model你的代码 std::thread() ↓ libstdc → gthr-posix.hGCC线程抽象层 ↓ libwinpthreadspthread_create ↓ Win32 API: CreateThread TLS SRWLock ConditionVariablewin32 model你的代码如果调用 std::thread新版才支持 ↓ libstdc → gthr-win32.h ↓ 直接 CreateThread / InitializeSRWLock 等Win32 API四、选型建议工程上绝大多数场景MSYS2Qt跨平台C使用 std::threadposix SEH UCRT只写纯 Windows C自己封装 CreateThread不碰 std::thread追求最小分发依赖win32 model但是生态差三思GCC 13新项目、想要更好性能标准一致性mcf
企业数字化 ERP 产品动态
相关推荐
【Python】并发_并行_同步_异步_进程_线程 并发 vs 并行
并发
概念:在一段时间内,当CPU面对多个任务时,会将每个任务交替着执行一段时间
特点:
对于某个瞬间,CPU实际上只在执行一个任务
CPU通过高频切换不同的任务,让每个任务都能得到推进࿰… · 2026/11/5 0:35:40
约瑟夫环/丢手绢问题(PTA例题:猴子选大王) 约瑟夫环/丢手绢问题(PTA例题:猴子选大王)
最近在做学校课后作业的时候遇到了这类问题, 感觉对数组初学者是有一些困难的.
在写这篇题解之前, 我在网上找到的对这个问题的解析, 个人感觉要么太过浅显, 要么太过深刻.
个人鄙见, 对于某些问题,… · 2026/11/5 3:53:02
模拟电工证考试app怎么用?郑州报考避坑指南帮你一次过 模拟电工证考试app怎么用?郑州报考避坑指南帮你一次过 怕考不过白交培训费?南阳初学者用模拟电工证考试app备考,真的能稳过吗?最近不少小伙伴问我,说在网上刷到各种培训机构,宣传得天花乱坠,但一上手就懵了。其实,关键不在于培训机构选得对不对… · 2026/11/7 14:43:19
内江电工证在哪里办理怎么考 低压高压电工证全国通用怎么考 内江电工证在哪里办理怎么考 低压高压电工证全国通用怎么考 你是不是也担心学历不高,怕报不了电工证?别急,内江电工证在哪里办理其实并不难,关键是要找到正规渠道。而且现在电工证是 全国通用… · 2026/11/7 14:43:19
岳阳电工证查询网保姆级教程:证书过期了不知道怎么复审延期 岳阳电工证查询网保姆级教程:证书过期了不知道怎么复审延期 你是不是也遇到过这种情况?特种作业证眼看就要到期了,却不知道该怎么做复审,甚至不知道这个证还能不能继续用?尤其是像电工证这种在工地、工厂都离不开的证件,… · 2026/11/7 14:43:19
电工证几岁不能复证千万别踩坑 电工证几岁不能复证千万别踩坑 你是不是也遇到过这种情况?手头活儿干得不错,但因为没有电工证,老板不给安排正式工作,工资也上不去。特种作业证,特别是电工证,已经成了很多工种的“入场券”。但如果你已经拿到证了,到了某个年纪,可能就 不能复证… · 2026/11/7 14:43:19
新密电工证国网可查保姆级教程:外省电工证怎么转过来 新密电工证国网可查保姆级教程:外省电工证怎么转过来 之前考的证在外省能不能转过来?这个问题我见过太多人问了,尤其是从外地来河南打工、工作的电工朋友。你是不是也担心,手上拿着的电工证是外省的,到了新密或者其他地方,能不能用?能不能查?能不能顺… · 2026/11/7 14:43:19
威海二职培训电工证通过率揭秘:特种作业证怎么考怎么用? 威海二职培训电工证通过率揭秘:特种作业证怎么考怎么用? 你有没有这样的困扰?找工作时被要求必须持有特种作业操作证,但你连证都没有,根本进不了门。特种作业证,尤其是电工证,已经成了不少行业入职的“硬门槛”。而 威海二职培训电工证… · 2026/11/7 14:42:19
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 11:25:08
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 12:02:18
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23
澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄? 澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄? 证书过期了不知道怎么复审延期?别慌,很多人在拿到【澳洲水电工证考试】的电子证书后,一不小心就忽略了复审时间,结果证书失效,工作受阻,甚至被单位追责。今天就从【澳洲水电工证考试… · 2026/11/7 0:00:41
电工作业提示版通过率揭秘:怎么考才能一次过? 电工作业提示版通过率揭秘:怎么考才能一次过? 怕考不过白交培训费?别急,今天我就从驻马店应届工程类毕业生的视角,带你全面了解电工作业提示版的考试流程、备考要点和真实通过率,帮你少走弯路、提高一次通过率。… · 2026/11/7 0:00:41
电工证年审报名千万别踩坑 外省证转过来要搞清这几点 电工证年审报名千万别踩坑 外省证转过来要搞清这几点 之前考的证在外省能不能转过来?这个问题是很多电工从业者最关心的,特别是像你这样在商丘从事公路工程的人员,经常需要跨省流动,证书的 有效性 和 可迁移性… · 2026/11/7 0:00:41
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 11:25:08
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 12:02:18
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23