![](/img/trans.png)
[英]What is the difference between std::condition_variable and std::condition_variable_any?
[英]What is the overhead associated with std::condition_variable_any
我在许多地方读过,有一些与std::condition_variable_any
相关的开销。 只是想知道,这是什么开销?
我的猜测是,因为这是一个可以使用任何类型的锁的通用条件变量,它需要手动滚动的等待实现(可能与另一个condition_variable和互斥或futex,或类似的东西),所以额外的开销可能来自那? 但不确定......而不是仅仅是pthread_cond_wait()
的本机包装(以及其他系统上的等价物)等。
作为后续,如果我说实现等待的东西,比如一个共享的互斥锁,那么由于性能开销,这种类型的条件变量是一个糟糕的选择吗? 在这种情况下我还能做些什么?
pthread_cond_wait()
/ SleepConditionVariableSRW()
,与plain std::condition_variable::wait()
相同,只需要一个原子系统调用来释放互斥锁,等待条件变量并重新获取互斥锁。 线程立即进入休眠状态,另一个线程 - 理想情况是被互斥锁阻塞的线程 - 可以立即接管同一个核心。
使用std::condition_variable_any
,传递的BasicLockable
的解锁和开始等待本机事件/条件不仅仅是一个系统调用,它首先在BasicLockable
上调用unlock()
方法,然后才发出syscall进行等待。 因此,您至少需要单独unlock()
的开销,而且您更有可能在操作系统端触发不太理想的调度决策。 最糟糕的情况是,解锁甚至导致在不同核心上继续等待线程,并带来所有相关的开销。
反过来,例如在虚假唤醒上,当处理不适用于通用BasicLockable
的本机互斥(在std::mutex
)时,也可能有OS侧调度优化。
两者都涉及一些簿记,以便提供notify_all()
逻辑(它实际上是每个等待线程的一个事件/条件)以及所有方法都是原子的保证,所以它们都带来了很小的开销。
真正的开销来自OS如何在组合的信号和等待锁定系统调用上做出良好的调度决策。 如果操作系统不熟悉调度,那么它几乎没有区别。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.