You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GCC 12.2.0中使用std::latch出现死锁问题求助

代码死锁问题解答

这段代码在理论上是无死锁的,你实际运行时出现的冻结情况并非代码逻辑本身的问题,大概率是编译配置或编译器实现缺陷导致的。

代码逻辑分析

每次循环中:

  • 创建计数为2的std::latch,两个线程执行的lambda会调用sync.arrive_and_wait()
  • 第一个调用该方法的线程会将latch计数减至1并阻塞,第二个调用的线程会将计数减至0,同时唤醒两个阻塞的线程,因此两个线程都会正常完成执行
  • 线程的join()操作都在latch的作用域内完成,确保latch的生命周期覆盖线程执行全程,不存在悬垂引用的问题

实际冻结的可能原因

  • 编译时未添加线程支持选项:GCC编译涉及std::thread的代码必须加上-pthread参数,否则线程库无法正确链接,会导致线程行为异常(比如死锁)。这是最常见的原因。
  • GCC 12.2的std::latch实现bug:C++20的同步原语在部分旧版本编译器中可能存在实现缺陷,你可以尝试升级到GCC 13及以上版本验证是否解决问题。

修复建议

用以下命令重新编译代码:

g++ -std=c++20 -pthread your_code.cpp -o your_program

运行编译后的程序,若问题消失则说明是编译配置的问题;若仍存在,建议升级编译器版本。

内容的提问来源于stack exchange,提问作者Koosha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 06:45:35