英特尔TBB库是开源的,所以我接过来一看......
它看起来像pop_if_present()
基本检查,如果队列为空,如果它立即返回。如果不是,它会尝试获取队列顶部的元素(这可能会失败,因为另一个线程可能已经出现并接受了它)。如果未命中,则在再次检查之前执行“atomic_backoff
”暂停。 atomic_backoff
只是简单地旋转了它被调用的前几次(每次增加两倍的旋转循环次数),但经过一定次数的暂停后,它只会屈服于操作系统调度程序,而不是旋转,因为它已经等待了一段时间,它可能做得很好。
对于普通的pop()
函数,如果队列中没有任何东西会执行,则atomic_backoff
会等待,直到队列中有东西出现为止。
注意,至少有2件有趣的事情(我反正)这一点:
的pop()
功能的东西在队列中露面执行自旋等待(最多点);它不会屈服于操作系统,除非它需要等待更多的短暂时间。所以,如你所料,没有太多的理由旋转自己打电话pop_if_present()
,除非你有别的东西,你要去调用之间做pop_if_present()
时pop()
不会屈服于操作系统,它通过简单地放弃这样做这是时间片。它不会阻塞同步对象上的线程,当一个项目被放置在队列中时可以发送信号 - 它似乎进入睡眠/轮询周期来检查队列中是否有弹出的内容。这让我很吃惊。
借此分析一粒盐...我用此分析的来源可能是有点老了(它实际上是从concurrent_queue_v2.h和.cpp),因为最近concurrent_queue有不同的API - 没有pop()
或pop_if_present()
,只是try_pop()
功能在最新的class concurrent_queue
接口。旧界面已被移动(可能有所变化)到concurrent_bounded_queue
类。看起来,当构建库以使用OS同步对象而不是繁忙的等待和轮询时,可以配置较新的concurrent_queues。