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
相关产品推荐
相关产品推荐

