【问题标题】:Use std::lock_guard with try_lock将 std::lock_guard 与 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 负责释放它?

【问题讨论】:

    标签: c++ multithreading c++11 mutex


    【解决方案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); } (来自stackoverflow.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()) {}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 2015-06-21
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多