对象返回自身的锁是否安全?

问题描述 投票:0回答:1

这段代码的风格是否正确/可取?也就是说,返回的锁是否保证在返回过程中保持互斥体锁定,而不是解锁然后重新锁定(甚至解锁并保持解锁状态)。我担心返回值的析构函数的动作。

#include <mutex>

struct BigObject
{
    auto get_lock()
    {
         return std::scoped_lock<std::mutex>(m_mutex);
    }
private:
    std::mutex m_mutex;
};

BigObject big;

int main()
{
    auto lock = big.get_lock();
    
    // ...
}

假设某个较大程序的上下文并发访问全局

big

“正常”风格是由调用者声明并初始化锁,但这里我们封装了互斥体并让调用者调用一个函数。 所以只能通过这个入口点来锁定对象。

额外问题 - 用

std::lock_guard
代替
std::scoped_lock
也正确吗?

c++ thread-safety mutex
1个回答
0
投票

返回的锁是否保证在返回过程中保持互斥体锁定,而不是解锁然后重新锁定(甚至解锁并保持解锁状态)。我担心返回值的析构函数的动作。

是的,它将保留锁并且不涉及析构函数。由于返回值优化 (RVO),

std::scoped_lock<std::mutex>
直接在接收变量中创建。从 C++17 开始就得到保证,并且您至少使用 C++17。

std::lock_guard
代替
std::scoped_lock
也正确吗?

是的。

© www.soinside.com 2019 - 2024. All rights reserved.