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

标签 c++ c++11

正是问题所述。在 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/

相关文章:

c++ - 输出总是产生 0

c++ - 为什么 test2 + test3 的运算符 << 不能重载?

c++ - std::shared_ptr:未调用自定义删除器

c++ - C++ 中的值语义和 move 语义之间有什么联系?

c++ - 在 C++ 11 线程中通过引用传递;变化是本地化的

c++ - 在不破坏元素的情况下调整 std::vector 的大小

c# - C++ 将 UTF 字节数组转换为字符串

C++ urljoin 等效项

c++通过csv文件和最后一列进行解析

C++(类和指针)