首页 > 解决方案 > 为什么互斥引用上的 lock_guard 会产生 C26110

问题描述

Visual Studio Professional 2019 项目(版本 16.3.6)中的以下代码会产生警告:

#include <thread>
#include <future>

class Foo {
public:
    mutable std::recursive_mutex _writingMutex;
    std::recursive_mutex& writingMutex() const { return _writingMutex; }
};

int main()
{
    Foo a;
    std::lock_guard<std::recursive_mutex> lock(a.writingMutex()); // produces C26110
    std::lock_guard<std::recursive_mutex> lock2(a._writingMutex); // no warning
}

第一个锁产生警告C26110

警告 C26110 调用者在调用函数“std::lock_guard::~lock_guard”之前未能持有锁“lock”

为什么会这样?将互斥锁作为参考传递不起作用吗?

标签: c++c++11visual-c++c++17std

解决方案


根据 Alan 的编译结果和 rustyx 的评论,我将回答我自己的问题:

这很可能是 Visual Studio 中的代码分析错误。看起来 C26110 无法通过引用识别互斥锁。该问题已在此处报告,我在此处添加了我的最小示例作为评论。该问题在最新版本 16.3.7 中仍然存在


推荐阅读