能够以较小的开销在调试模式下声明互斥对象是否锁定是很有用的.查看已知的选项,由于开销低,我选择了implement this using an std::mutex
subclass.
子类的接口是std :: mutex的接口的超集,因此大多数事情都可以很好地使用它.例如std::unique_lock
被模板化以利用具有特定接口的任何锁类型.
问题在于std::condition_variable
,尤其是等待成员,例如:
template<class Predicate>
void wait(std::unique_lock<std::mutex> &lock, Predicate pred);
可以看出,该方法需要非常特定的unique_lock / mutex组合.不幸的是,Liskov principle也没有扩展到容器派生的容器中.被转换为容器< 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
.它具有等待的模板版本.