notify_one性能影响
notify_one performance impact
我正在阅读一些关于std::condition_variable
的信息,特别是关于如何使用std::condition_variable::notify_one
通知等待线程的信息。
遇到了几个问题,我很乐意得到答案:
- 当线程调用
notify_one
(操作系统方面(时,究竟会发生什么?我想这是特定于操作系统的,所以为了论证 - 我在 Windows 中工作。 - 如果线程在没有等待线程时调用
notify_one
会发生什么情况?此调用是否对性能有任何影响(CPU 周期、电源等(?
谢谢
上,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
- 数组中的不同浮点值会影响性能 10 倍 - 为什么?
- 为 lambda 分配名称会影响性能吗?
- 通过默认复制构造函数比较 C++ 字符串是否会影响性能,原因为何?
- 隐式转换函数的返回对象时是否会影响性能?
- 何时应使用 C++ 固定宽度整数类型,它们如何影响性能?
- 性能 - 链接 C 尖锐和C++如何影响性能
- C 指针向量如何影响性能
- 公开类的内部组件,以防止编写过多代码和影响性能
- .NET 4,C ,IF..Else和Switch()如何影响性能
- 变量会影响性能吗
- 更改自动分配内存的范围是否会影响性能
- 如何修复不影响性能的"runtime error"?
- 返回间接类型化对象是否会影响性能
- 调用恒定复杂度O(1)5行函数会显著影响性能,原因如下
- 使用Pimpl的高级变体时可能会影响性能
- 功能原型设计会影响性能吗
- 在C/ c++中包含未使用的头文件会影响性能吗?
- 我可以在不影响性能的情况下将此宏更改为内联函数吗
- Dispatch_async在下面的代码中影响性能
- c++中的操作符重载如何影响性能