c++ - 为什么互斥引用上的 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”
为什么会这样?将互斥锁作为参考传递不起作用吗?
解决方案
根据 Alan 的编译结果和 rustyx 的评论,我将回答我自己的问题:
这很可能是 Visual Studio 中的代码分析错误。看起来 C26110 无法通过引用识别互斥锁。该问题已在此处报告,我在此处添加了我的最小示例作为评论。该问题在最新版本 16.3.7 中仍然存在
推荐阅读
- javascript - 我正在尝试创建一个脚本,当鼠标悬停在链接上时,它将更改 SVG 上的 css 类
- c# - 如何从外部 dll 加载包含函数指针的结构?
- oracle - record.FIELD 中的字段名称是否必须是游标循环中的文字?
- android - 类型变量 T 与上限 LineChart,View
- c# - 对唯一整数数组进行分组
- var - 使用 predict 预测 VECM
- python - 我应该如何在 python 中使用闭包创建属性?
- c# - 如何从数据库重新加载相同的值
- r - 在 r 的散点图中使用函数聚合标记点
- amazon-athena - 如何将带 NULL 值的引用 CSV 读入 Amazon Athena