能够在调试模式下断言,以及相对较小的开销,是否锁定互斥锁是有用的。查看已知选项,由于开销较低,我选择了implement this using an std::mutex
subclass。
子类的接口是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 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
,这是为这样的东西设计的。