std::lock_guard<std::mutex> lock(m) 是否有简写?

Is there a shorthand for std::lock_guard<std::mutex> lock(m)?

本文关键字:std lock 是否 mutex guard lt gt      更新时间:2023-10-16

正是问题所表达的。在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);

这利用了copy-list初始化不会创建额外的临时(即使在概念上也是如此)这一事实。单参数构造函数是explicit,不能用于复制列表初始化,所以我们先锁定互斥锁,然后使用std::adopt_lock构造函数。

返回值然后直接绑定到lg,它将其生命周期延长到引用的生命周期,再次在进程中不创建临时(甚至概念上)。

除了什么@ tc。下面是c++ 17的方法:

auto lock = std::lock_guard(someMutex);

您可以阅读此提案中的更改:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0091r3.html

当前的两个答案都建议使用auto关键字来避免键入类型名称。这没有错,但我更喜欢我的代码包含typename,因此非常谨慎地使用auto关键字。我建议将类型混叠:

using MutexLockGuard = std::lock_guard<std::mutex>;

对于c++ 17及更新版本仅:

std::lock_guard lock(mutex)