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

标签 c++ multithreading templates c++11

能够在 Debug模式下以相当小的开销断言互斥体是否被锁定是很有用的。查看已知选项,我选择了 implement this using an std::mutex subclass由于低开销。

子类的接口(interface)是std::mutex 的超集,因此大多数事情都适用于它。例如, std::unique_lock 被模板化以利用具有特定接口(interface)的任何锁类型。

问题出在 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. 为什么会这样?

即使意图是强制使用 std::unique_lock ,那么为什么不能使用以下内容:

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

编辑

正如@Lingxi 所解释的,以及@T.C 进一步指出的,这里绝对正确且非常简单的解决方案是使用 condition_variable_any ,专为此类内容而设计。

最佳答案

尝试 std::condition_variable_any .它有一个 wait 的模板版本。

关于c++ - 为什么 std::condition_variable 不是按锁类型模板化的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30122982/

相关文章:

c++ - 无法理解 Robert Martin 的 ISP 文章中的 "contradiction"

c++ - 如何从c++中的文本文件填充数组

android - 在 Android Java 类中调用 "getContentResolver "

c - 有没有办法在 c 中将任何 exec 系列函数作为线程运行

c++ - 模板参数列表太少问题

c++ - 找出两组是否重叠的最快方法?

c++ - Java 的 EnumSet.allOf() 的 C++ 等价物是什么?

python - 如何在python套接字编程中应用多线程,我尝试过但不起作用?

c++ - 为什么不能在 C++ 中为动态数组重载插入运算符?

c++ - 如何在源文件中定义模板函数