gpt4 book ai didi

c++ - boost::lockfree::spsc_queue 忙等待策略。有阻塞流行音乐吗?

转载 作者:可可西里 更新时间:2023-11-01 16:37:34 30 4
gpt4 key购买 nike

所以我正在使用 boost::lockfree::spec_queue 通过两个运行我应用程序中两个对象的仿函数的 boost_threads 进行通信。

除了 spec_queue::pop() 方法是非阻塞的之外,一切都很好。即使队列中没有任何内容,它也会返回 True 或 False。但是我的队列似乎总是返回 True(问题 #1)。我认为这是因为我预先分配了队列。

typedef boost::lockfree::spsc_queue<q_pl, boost::lockfree::capacity<100000> > spsc_queue;

这意味着要有效地使用队列,我必须忙于等待使用 100% cpu 不断弹出队列。我宁愿不睡任意长的时间。我在 java 中使用了其他队列,这些队列会阻塞直到对象可用。这可以用 std::或 boost::数据结构来完成吗?

最佳答案

根据定义,无锁队列没有阻塞操作。

您将如何同步数据结构?没有内部锁,原因很明显,因为这意味着所有客户端都需要同步它,使它成为你的祖父锁定并发队列。

所以确实,你必须自己设计一个等待函数。你如何做到这一点取决于你的用例,这可能是图书馆不提供的原因(免责声明:我没有检查过,我也没有声称知道完整的文档)。

那么你能做什么:

  • 正如您已经描述的那样,您可以在一个紧密的循环中旋转。显然,如果您知道您的等待条件(队列非空)总是很快就会得到满足,您就会这样做。

  • 或者,以特定频率轮询队列(同时进行微 sleep )。安排一个好的频率是一门艺术:对于某些应用程序,100 毫秒是最佳的,对于其他应用程序,潜在的 100 毫秒等待会破坏吞吐量。因此,改变并衡量您的性能指标(如果您的应用程序要部署在数据中心的多个内核上,请不要忘记功耗:))。

最后,您可以采用混合解决方案,旋转固定次数的迭代,如果没有任何结果,则求助于(增加)间隔轮询。这将很好地支持突发高负载的服务器应用程序。

关于c++ - boost::lockfree::spsc_queue 忙等待策略。有阻塞流行音乐吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22486552/

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