C++20代码死锁排查请求及在线编译器推荐(GCC12.1无输出)
问题解答
代码是否存在死锁?
这段代码不存在典型死锁场景,但存在严重的未定义行为,这才是导致无输出的核心原因:
std::counting_semaphore<1>的模板参数1限定了该信号量的最大许可数为1,但构造时传入的初始值是2,违反了C++标准要求(初始许可数不得超过最大许可数),触发未定义行为。- 这种未定义行为可能导致程序启动即崩溃、卡死或逻辑混乱,自然无法正常输出内容。
修正方案:将信号量的最大许可数改为2(即std::counting_semaphore<2> prepareSignal(2);),或者将初始许可数调整为不超过1的数值。修正后程序逻辑可正常运行:prepareWork释放1个许可,两个completeWork线程分别获取许可执行后续操作。
推荐的在线编译器
- GCC系列:选用支持C++20的GCC 12及以上版本的在线编译工具,可准确复现问题,报错信息直观
- Clang系列:对C++标准的兼容性和严格性更优,适合排查未定义行为类问题
- MSVC系列:用于验证代码在Windows编译器下的运行表现,覆盖跨平台场景
内容的提问来源于stack exchange,提问作者Mangy
相关产品推荐
相关产品推荐

