繁体   English   中英

与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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM