std::condition_variable可以与std::lock_guard一起使用
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
}
见http://en.cppreference.com/w/cpp/thread/unique_lock
任何对条件变量wait()
的调用都将始终需要对lock()
和unlock()
调用基础mutex
。由于包装器lock_guard<>
不提供这些函数,因此永远不能与wait()
一起使用。
您仍然可以基于lock_guard<>
编写自己的简单互斥锁包装器,并添加两个必要的方法。另外,您必须使用condition_variable_any
,它接受任何具有lock()/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 ...
...
不可能,但你实际上不需要。
std::unique_lock
在析构函数中自动解锁,如果它被锁定。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何从 std::atomic 中提取指针 T<T>?
- 为什么 std::unique 不调用 std::sort?
- 使用std::函数映射对象方法
- 可组合的lambda/std::函数与std::可选