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

为何std::lock_guard未按预期锁定互斥锁?代码异常咨询

问题原因分析

你的代码里出现的情况,本质是触发了未定义行为,而非“成功获取锁”:

  • 标准C++中的std::mutex是普通互斥锁,明确禁止同一线程重复调用lock()操作。当你在main函数已经持有锁的情况下,func函数里的lock_guard再次尝试获取同一mutex,这属于违反标准的未定义行为。
  • 未定义行为的表现没有任何保证,它可能看起来“正常执行”,也可能直接导致程序崩溃、死锁,或者在不同编译器/操作系统下表现出完全不同的结果。你当前看到的“成功获取锁”只是未定义行为的一种随机表现而已。

如果需要支持同一线程多次获取同一锁的场景,应该使用std::recursive_mutex,它专门为这种递归加锁的需求设计,要求解锁的次数必须和加锁次数一致。修正后的代码示例如下:

#include <cstdio>
#include <mutex>

// 替换为递归互斥锁
std::recursive_mutex myMutex;

void func(void)
{
    std::lock_guard<std::recursive_mutex> lock(myMutex);
    std::printf("Successfully got lock recursively!!!\n"); 
}

int main()
{
    std::lock_guard<std::recursive_mutex> lock(myMutex);
    func();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:08:12