基于范围的锁保护和返回值的计时
Timing of scope-based lock guards and return values
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.
}
};
关于保护和返回值复制的保证时间是什么? 复制是在保持锁的同时进行,还是在允许(或实际!(优化的情况下,可以在函数体返回后完成一些复制?
本地对象的所有析构函数在函数体终止后调用。return 语句是函数体的一部分,因此可以保证在执行复制时将保持锁。
优化不会改变这一事实,它们只会更改副本的目的地 - 它可以是呼叫站点上的中间临时或真实目的地。锁只存在于第一个副本中,无论它被发送到哪里。
但是,请记住,代码中的实际范围锁定不正确。您需要lock_guard
- 但可能这只是一个演示复制粘贴错误,而实际代码具有真正的保护措施。
std::lock
没有建立范围守卫!它只会锁定。它不会解锁。你想要这个:
std::unique_lock<std::mutex> lock(_lock);
它锁定施工并在破坏时解锁(在范围退出时发生(。
返回值的初始化将在局部变量被销毁之前发生,因此在保持锁时发生。不允许编译器优化中断正确同步的代码。
但是,请注意,如果返回值随后被复制或移动到某个其他变量中,则第二次复制或移动将在释放锁后发生。
相关文章:
- 从python中调用C++函数并获取返回值
- 为什么模板类中的对象不能返回值
- 返回值优化:显式移动还是隐式
- lock_guard是否保护返回值
- 调用CreateProcess()并获取字符串的返回值
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 查找 GCD:并非所有控制路径都返回值
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 如何从 std::thread 返回值
- 将返回值从 exe 传递到 bat,并将其传递给 C# 中的进程
- 方法错误"not all control paths return a value"和方法不返回值
- 如何读取 C++ SAFEARRAY**,该 SAFEARRAY** 是 COM 互操作的结果,其中 C# 返回值为
- 对fread的返回值感到困惑
- 程序不向函数返回值
- 如何在另一个函数中使用返回值作为参数?
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 使用 std::p air 进行返回值优化
- 基于范围的锁保护和返回值的计时