正是问题所述。在 C++ 中,理想情况下是 11,但也对 14 及更高版本感到好奇,是否有以下简写语法:
std::mutex someMutex;
std::lock_guard<std::mutex> lg(someMutex);
如果我想更改为 std::recursive_mutex
,最好是推断互斥锁的类型以避免重构.
换句话说,一种方法:
std::mutex someMutex;
std::lock_guard lg(someMutex);
或者
auto lg = make_lock_guard(someMutex);
对于现代 C++ 的所有类型推断能力,输入 std::lock_guard<std::mutex>
似乎是非常多余的。每次我想做一个。
最佳答案
对于 C++17 之前的版本:
template<class Mutex>
std::lock_guard<Mutex> make_lock_guard(Mutex& mutex) {
mutex.lock();
return { mutex, std::adopt_lock };
}
用作:
std::mutex someMutex;
auto&& lg = make_lock_guard(someMutex);
这利用了复制列表初始化不会创建额外的临时(甚至在概念上)这一事实。单参数构造函数是explicit
,不能用于copy-list-initialization,所以我们先锁定mutex,然后使用std::adopt_lock
构造函数。
然后将返回值直接绑定(bind)到 lg
,这会将其生命周期延长到引用的生命周期,再次在此过程中不创建临时(甚至在概念上)。
关于c++ - 是否有 std::lock_guard<std::mutex> lock(m) 的简写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38836090/