将 std::lock_guard 与 try_lock 一起使用

Posted

技术标签:

【中文标题】将 std::lock_guard 与 try_lock 一起使用【英文标题】:Use std::lock_guard with try_lock 【发布时间】:2015-11-29 08:31:15 【问题描述】:

有没有办法让std::lock_guard 在获取互斥锁时调用try_lock 而不是lock

我能想到的唯一方法是使用std::adopt_lock

if (!_mutex.try_lock())

    // Handle failure and return from the function

std::lock_guard<my_mutex_class> lock(_mutex, std::adopt_lock);

是否有针对我的问题的内置解决方案,而不是显式获取锁,然后让lock_guard 负责释放它?

【问题讨论】:

【参考方案1】:

lock_guard 的基本设计不变式是它始终持有锁。这最大限度地减少了开销,因为它的析构函数可以无条件地调用unlock(),并且它不必存储额外的状态。

如果您需要尝试锁定行为,请使用unique_lock

std::unique_lock<std::mutex> lock(_mutex, std::try_to_lock);
if(!lock.owns_lock())
    // mutex wasn't locked. Handle it.

【讨论】:

可以使用 std::lock_guard 如下:if (_mutex.try_lock()) std::lock_guard&lt;std::mutex&gt; lock(_mutex, std::adopt_lock); (来自***.com/a/30457040) @iliis 你的意思是,这个问题到底是想避免什么? 是的,没错。我也应该阅读问题,而不仅仅是答案... facepalm 我个人更喜欢if(auto lock = std::unique_lock_mutex, std::try_to_lock) do_stuff(); @BennoStraub 您发布的代码不起作用,应该是: std::unique_lock<:mutex> lock(g_i_mutex, std::try_to_lock); if (lock.owns_lock())

以上是关于将 std::lock_guard 与 try_lock 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

std::unique_lock与std::lock_guard分析

C++ lock_guard 与 mutex.lock()

C++11:互斥锁std::mutex和std::lock_guard/std::unique_lock

C++11:互斥锁std::mutex和std::lock_guard/std::unique_lock

linux C++互斥锁std::lock_guard(轻锁)std::unique_lock(重锁)区别

linux C++互斥锁std::lock_guard(轻锁)std::unique_lock(重锁)区别