gpt4 book ai didi

c++ - notify_one 性能影响

转载 作者:可可西里 更新时间:2023-11-01 13:31:41 42 4
gpt4 key购买 nike

我读了一些关于 std::condition_variable 的内容更具体地说,如何使用 std::condition_variable::notify_one 通知等待线程。

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

  • 当一个线程调用 notify_one 时到底发生了什么(OS-wise)?我想这是特定于操作系统的,所以为了争论起见——我在 Windows 中工作。
  • 如果一个线程在没有等待线程的情况下调用notify_one 会怎样?此调用是否有任何性能影响(CPU 周期、功率等)?

谢谢

最佳答案

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

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

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

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

What happens if a thread calls notify_one when there is no waiting thread?

取一个mutex,检查是否有线程在等待,释放mutex。结束。

Does this call have any performance impact (CPU-cycles, power etc)?

当然可以,它会消耗几个周期,并且需要 CPU 处于运行状态。偶尔做一次不会有什么坏处。在紧密的循环中连续执行此操作会耗电。

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

关于c++ - notify_one 性能影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35265409/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com