class C {
mutable std::mutex _lock;
map<string,string> deep_member;
public:
auto get_big_lump()
{
std::unique_lock<std::mutex> lock(_lock); // establish scope guard
return deep_member; // copy the stuff while it can't be changed on another thread.
}
};
Run Code Online (Sandbox Code Playgroud)
关于保护和返回值复制的保证时间是什么? 如果允许(或实际!)优化,复制将在持有锁的同时进行,还是可以在函数体返回后完成?
所有局部对象的析构函数都会在函数体终止后调用。Return 语句是函数体的一部分,因此保证在执行复制时保持锁定。
优化不会改变这一事实,它们只会更改副本的目的地 - 它可以是调用站点上的中间临时目的地或真实目的地。锁只存在于第一个副本中,无论它被发送到哪里。
但是,请记住代码中的实际范围锁定不正确。你需要lock_guard- 但有可能这只是一个演示复制粘贴错误,而真正的代码有真正的保护。
| 归档时间: |
|
| 查看次数: |
554 次 |
| 最近记录: |