C++ 通知_一个性能影响

C++ 通知_一个性能影响,c++,windows,multithreading,c++11,C++,Windows,Multithreading,C++11,我读了一些关于如何使用std::condition\u variable::notify\u one通知等待线程的内容,尤其是这些内容 我遇到了几个问题,我很乐意得到答案: 当线程调用notify_one(操作系统方面)时,会发生什么情况?我想这是操作系统特有的,所以为了便于讨论,我在Windows中工作 当没有等待线程时,如果线程调用notify_one,会发生什么情况?此调用是否有任何性能影响(CPU周期、电源等) 感谢windows上的,std::condition_变量很可能是根据本

我读了一些关于如何使用
std::condition\u variable::notify\u one
通知等待线程的内容,尤其是这些内容

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

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

感谢windows上的

std::condition_变量
很可能是根据本机windows条件变量实现的。 见:

在类unix系统上,它们通常以pthreads信号量/互斥对的形式实现

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

长话短说,在您应该的时候调用
notify_one
,即在更改状态并释放锁后,这是一个相当便宜的操作。在一个紧密的循环中调用
notify_one
,没有好的理由,这可能不是一个好主意

当没有等待线程时,如果线程调用notify_one会发生什么

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

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

是的,当然,它需要几个周期,并且需要CPU运行。偶尔做一次不会有什么坏处。在一个紧密的循环中持续这样做会消耗电力


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

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

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

Microsoft标准库的condition_变量是根据并发运行时的condition变量实现的,从Windows Vista开始,condition_变量是根据WinAPI RTL_condition_变量实现的。无法实现这一点。然而,它的实现很有可能基于这篇微软研究论文:


在unix系统上,如果涉及互斥,整个notify操作如何避免切换到内核模式?我想这实际上取决于互斥锁本身的实现。@athos你是指unix还是Linux?据我所知,linux提供了futex,这是一个用户空间的对象。我不相信有任何转换到内核模式涉及。我的意思是unix,例如mac os。。。有Futex吗?