能够在 Debug模式下以相当小的开销断言互斥体是否被锁定是很有用的。查看已知选项,我选择了 implement this using an std::mutex
subclass由于低开销。
子类的接口(interface)是std::mutex
的超集,因此大多数事情都适用于它。例如, std::unique_lock
被模板化以利用具有特定接口(interface)的任何锁类型。
问题出在 std::condition_variable
,特别是 wait
成员,例如:
template<class Predicate>
void wait(std::unique_lock<std::mutex> &lock, Predicate pred);
可以看出,该方法需要一个非常具体的 unique_lock
/mutex
组合。不幸的是,Liskov principle不扩展 container<derived>
正在转换为 container<base>
.
我不明白
- 为什么会这样?
即使意图是强制使用 std::unique_lock
,那么为什么不能使用以下内容:
template<class Predicate, class Lock=std::mutex>
void wait(std::unique_lock<Lock> &lock, Predicate pred);
- 如何合理地解决这个问题?
编辑
正如@Lingxi 所解释的,以及@T.C 进一步指出的,这里绝对正确且非常简单的解决方案是使用 condition_variable_any
,专为此类内容而设计。
最佳答案
尝试 std::condition_variable_any
.它有一个 wait
的模板版本。
关于c++ - 为什么 std::condition_variable 不是按锁类型模板化的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30122982/