std::lock_guard<std::mutex> lock(m) 是否有简写?
Is there a shorthand for std::lock_guard<std::mutex> lock(m)?
正是问题所表达的。在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)
相关文章:
- 为什么 c++11 std::lock 和 std::scoped_lock 至少需要 2 个参数?
- 为什么"weak.lock()"返回"nullptr" "auto weak=std::make_shared<int>(42);"的定义?
- DRD 报告"conflicting load" std::mutex::lock 上的错误
- 在 std::tie 中使用 std::weak_ptr::lock()
- std::lock_guard 怎么可能比 std::mutex::lock() 更快?
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- std::lock 仍然导致死锁
- 在任何地方对C++中所有并行线程中的所有锁定和解锁实例使用相同的 std::mutex 和 lock 对象
- 当我调用lock()时,为什么std :: mutex会引发异常
- 使用 std::lock (c++11) 的大量 CPU 负载
- std::lock() equivalent for boost::shared_mutex?
- 为什么在 std::lock 中没有超时支持
- “std::mutex”和“std::lock”是否保证处理器间代码中的内存同步
- std::weak_ptr:lock或shared_ptr构造函数
- std::mutex::lock可以抛出即使一切看起来"good"?
- std::weak_ptr.lock在多线程c++中的语义
- STD::Lock 的友元函数定义和替代提升函数
- 什么是更好的 std::lock_guard<std::mutex> lock(std::mutex mutex_var); 或 std::mutex mutex_var.lock();
- 尝试std::lock[_unique]和std::shared_mutex的线程是否会被调用std::lock_sha
- C++std::lock和std::unique_lock之间有什么区别