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

