notify_one性能影响

notify_one performance impact

本文关键字:影响 性能 one notify      更新时间:2023-10-16

我正在阅读一些关于std::condition_variable的信息,特别是关于如何使用std::condition_variable::notify_one通知等待线程的信息。

遇到了几个问题,我很乐意得到答案:

  • 当线程调用notify_one(操作系统方面(时,究竟会发生什么?我想这是特定于操作系统的,所以为了论证 - 我在 Windows 中工作。
  • 如果线程在没有等待线程时调用notify_one会发生什么情况?此调用是否对性能有任何影响(CPU 周期、电源等(?

谢谢

在 Windows

上,std::condition_variable 很可能根据本机 Windows 条件变量实现。请参阅:https://msdn.microsoft.com/en-us/library/windows/desktop/ms682052(v=vs.85(.aspx

在类 unix 系统上,它们通常是根据 pthreads 信号量/互斥对来实现的。

整个操作应该在用户空间中进行,因此您无需付费切换到内核模式,但您将在幕后使用两个同步原语。这将意味着将发出内存围栏,因此总会付出一些代价。

长话短说,在应该的时候调用notify_one,即在更改条件状态并释放锁之后,这是一个相当便宜的操作。无缘无故地将notify_one称为紧密循环可能不是一个好主意。

如果线程在没有等待线程的情况下调用notify_one,会发生什么情况?

取一个互斥锁

,检查是否有线程在等待,释放互斥锁结束。

此调用是否对性能有任何影响(CPU 周期、电源等(?

是的,当然,它消耗几个周期并要求 CPU 正在运行。偶尔做一次不会有什么坏处。在紧密循环中连续进行会消耗功率。

我想我的问题是,"用例是什么"?如果你每秒向生产者/消费者队列添加一百万个项目,那么你将花费大量的时间和精力来通知不存在的消费者。如果每秒增加 10 个,则花费在notify_one上的时间甚至可能不会显示在任何性能跟踪中。

这些问题非常特定于实现。仅仅说你在Windows上是不够的;每个标准库可能具有不同的实现,调试版本可能具有与发布版本不同的实现。

当没有线程正在等待时notify_one的语义效果是无操作。在实现方面,线程至少必须检查一个原子变量以确定是否有任何线程正在等待。所以有一点开销。

Microsoft标准库的condition_variable是根据并发运行时的条件变量实现的,该变量从 Windows Vista 开始,根据 WinAPI RTL_CONDITION_VARIABLE实现。其实施是无法实现的。但是,它的实现很有可能基于这篇Microsoft研究论文:

http://research.microsoft.com/pubs/64242/implementingcvs.pdf