为什么std :: condition_variable不是按锁类型模板化的?

时间:2015-05-08 11:41:43

标签: c++ multithreading templates c++11

能够在调试模式下断言,以及相对较小的开销,是否锁定互斥锁是有用的。查看已知选项,由于开销较低,我选择了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>

我不明白

  1. 为什么会这样?
  2. 即使意图强制使用std::unique_lock,为什么不能使用以下内容:

    template<class Predicate, class Lock=std::mutex>
    void wait(std::unique_lock<Lock> &lock, Predicate pred);
    
    1. 如何合理地解决这个问题?
    2. 修改

      正如@Lingxi所解释的那样,@ T.C进一步指出,这里绝对正确且非常简单的解决方案是使用condition_variable_any,这是为这样的东西设计的。

1 个答案:

答案 0 :(得分:3)

试试std::condition_variable_any。它的模板版本为wait