这段代码的风格是否正确/可取?也就是说,返回的锁是否保证在返回过程中保持互斥体锁定,而不是解锁然后重新锁定(甚至解锁并保持解锁状态)。我担心返回值的析构函数的动作。
#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
也正确吗?
返回的锁是否保证在返回过程中保持互斥体锁定,而不是解锁然后重新锁定(甚至解锁并保持解锁状态)。我担心返回值的析构函数的动作。
是的,它将保留锁并且不涉及析构函数。由于返回值优化 (RVO),
std::scoped_lock<std::mutex>
直接在接收变量中创建。从 C++17 开始就得到保证,并且您至少使用 C++17。
用
代替std::lock_guard
也正确吗?std::scoped_lock
是的。