为什么互斥引用上的 lock_guard 会产生 C26110
Why does a lock_guard on a mutex reference produce 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:
Warning C26110 Caller failing to hold lock 'lock' before calling function 'std::lock_guard::~lock_guard'
为什么会这样?传递互斥体作为参考不起作用吗?
根据Alan的编译结果和rustyx的评论,我来回答我自己的问题:
这很可能是 Visual Studio 中的代码分析错误。看起来 C26110 无法通过引用识别互斥量。该问题已报告 here,我在此处添加了我的最小示例作为评论。这个问题在最新版本 16.3.7 中也仍然存在
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:
Warning C26110 Caller failing to hold lock 'lock' before calling function 'std::lock_guard::~lock_guard'
为什么会这样?传递互斥体作为参考不起作用吗?
根据Alan的编译结果和rustyx的评论,我来回答我自己的问题:
这很可能是 Visual Studio 中的代码分析错误。看起来 C26110 无法通过引用识别互斥量。该问题已报告 here,我在此处添加了我的最小示例作为评论。这个问题在最新版本 16.3.7 中也仍然存在