[英]Is possible to use std::condition_variable with std::lock_guard?
我正在使用std::condition_variable
和std::unique_lock
这样的结合。
std::mutex a_mutex;
std::condition_variable a_condition_variable;
std::unique_lock<std::mutex> a_lock(a_mutex);
a_condition_variable.wait(a_lock, [this] {return something;});
//Do something
a_lock.unlock();
它工作正常。 据我所知, std::condition_variable
接受std::unique_lock
让它等待。 但是,我试图将它与std::lock_guard
结合但不能。
我的问题是: 是否可以用std::lock_guard
替换std::unique_lock
? 这可以减轻我每次使用时手动解锁锁的麻烦。
不,如果与std::condition_variable
一起使用,则需要std::unique_lock
。 std::lock_guard
可能具有较少的开销,但它不能与std::condition_variable
一起使用。
但是std::unique_lock
不需要手动解锁,当它超出范围时也会解锁,比如std::lock_guard
。 所以等待代码可以写成:
std::mutex a_mutex;
std::condition_variable a_condition_variable;
{
std::unique_lock<std::mutex> a_lock(a_mutex);
a_condition_variable.wait(a_lock, [this] {return something;});
//Do something
}
对条件变量的任何对wait()
调用总是需要lock()
和unlock()
底层mutex
。 由于包装器lock_guard<>
不提供这些功能,因此它永远不能与wait()
一起使用。
你仍然可以编写自己的基于lock_guard<>
的简单互斥包装器,并添加2个必要的方法。 此外,您必须使用condition_variable_any
,它接受带锁()/ unlock()接口的任何锁/互斥锁:
#include <mutex>
template<typename _mutex_t>
class my_lock_guard
{
public:
explicit my_lock_guard(_mutex_t & __m) : __mutex(__m)
{ __mutex.lock(); }
my_lock_guard(_mutex_t & __m, std::adopt_lock_t) : __mutex(__m)
{ } // calling thread owns mutex
~my_lock_guard()
{ __mutex.unlock(); }
void lock()
{ __mutex.lock(); }
void unlock()
{ __mutex.unlock(); }
my_lock_guard(const my_lock_guard &) = delete;
my_lock_guard& operator=(const my_lock_guard &) = delete;
private:
_mutex_t & __mutex;
};
然后:
#include <condition_variable>
...
std::mutex m;
my_lock_guard<std::mutex> lg(m);
std::condition_variable_any cva;
cva.wait(lg, [] { return something;});
// do something ...
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.