c++ - 从互斥锁函数中按值返回成员
问题描述
假设(对于一个玩具示例)我有这个类:
class Foo {
mutable std::mutex mutex;
std::vector<int> data;
public:
void add(int x) {
std::lock_guard<std::mutex> lock(mutex);
data.push_back(x);
}
std::vector<int> getData() const;
};
现在,我确定这是一个好的版本getData()
:
std::vector<int> Foo::getData() const {
std::lock_guard<std::mutex> lock(mutex);
auto result = data; // Safely copy.
return result; // Return a local by value.
} // lock goes out of scope and unlocks.
但是这个呢?这安全吗?:
std::vector<int> Foo::getData() const {
std::lock_guard<std::mutex> lock(mutex);
return data; // <- Is this threadsafe?
}
该return
行发生在lock
的生命周期内,所以也许它是安全的?OTOH,我们正在复制一个成员,所以data
寿命更长lock
。data
也许锁在复制到调用者之前超出范围?
那么:第二个版本是线程安全的吗?
解决方案
推荐阅读
- node.js - 使用nodejs从cloudinary中获取图像的exif(image_metadata)
- appium - appium - 如何在原生 android 应用程序中获取元素的背景颜色
- javascript -
- 不从firebase填充名称
- python - Python 电子邮件库 - 解析消息/rfc822 附件
- git - 如何将托管在gerrit上的代码库集成到jenkins?
- python - 使用python在现有excel文件的不同工作表中合并新工作表中的结果摘要
- .net - Linux 操作系统中 .Net 应用程序的路径格式
- c# - 如何在 c# 编写的单元测试代码中模拟 System.IO.File.ReadAllLines("./abc.html")
- swift3 - 如何解决“您的应用或其元数据似乎仍包含误导性内容。”
- logging - 如何通过 graylog-collector-sidecar 从同一服务器获取多个日志文件?