基于范围的锁保护和返回值的计时

Timing of scope-based lock guards and return values

本文关键字:保护 返回值 范围 于范围      更新时间:2023-10-16
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);

它锁定施工并在破坏时解锁(在范围退出时发生(。

返回值的初始化将在局部变量被销毁之前发生,因此在保持锁时发生。不允许编译器优化中断正确同步的代码。

但是,请注意,如果返回值随后被复制或移动到某个其他变量中,则第二次复制或移动将在释放锁发生。