无论是否锁定互斥对象,在调试模式下具有断言的能力(开销相当小)是非常有用的。考虑到已知的选项,由于管理费用低,我选择了子类。
子类的接口是std::mutex的一个超集,因此大多数事情都与它很好地工作。例如,std::unique_lock被模板化,以利用具有特定接口的任何锁类型。
问题在于std::condition_variable,特别是wait成员,例如:
template<class Predicate>
void wait(std::unique_lock<std::mutex> &lock, Predicate pred);可以看出,该方法需要非常特定的unique_lock/mutex组合。不幸的是,Liskov原理没有扩展到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,它是为类似这样的东西而设计的。
发布于 2015-05-08 11:49:21
试试std::condition_variable_any。它有一个wait的模板版本。
https://stackoverflow.com/questions/30122982
复制相似问题