c-为什么std :: condition_variable没有按锁类型进行模板化?

能够以较小的开销在调试模式下声明互斥对象是否锁定是很有用的.查看已知的选项,由于开销低,我选择了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.它具有等待的模板版本.

上一篇:JavaScript模板仅对将小项目插入DOM有用吗?


下一篇:PHP View,使用模板