将 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<std::mutex> 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++11:互斥锁std::mutex和std::lock_guard/std::unique_lock
C++11:互斥锁std::mutex和std::lock_guard/std::unique_lock