eas*_*ger 9 c++ multithreading boost boost-thread lock-free
所以我使用a 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;
Run Code Online (Sandbox Code Playgroud)
这意味着要有效地使用队列,我必须忙着等待不断使用100%cpu弹出队列.我宁愿不睡任意的时间.我已经在java中使用了其他队列,直到对象可用为止.这可以用std ::或boost :: data结构来完成吗?
根据定义,无锁队列没有阻塞操作.
您将如何在数据结构上同步?由于显而易见的原因,没有内部锁定,因为这意味着所有客户端都需要在其上进行同步,使其成为您的祖父锁定并发队列.
所以,你必须自己设计一个等待功能.你如何做到这一点取决于你的用例,这可能是图书馆没有提供的用例(免责声明:我没有检查过,我没有声称知道完整的文档).
所以,你可以做什么:
正如您已经描述的那样,您可以在紧密循环中旋转.显然,如果你知道你的等待条件(队列非空)总是很快得到满足,你就会这样做.
或者,以特定频率轮询队列(同时进行微睡眠).调度好的频率是一门艺术:对于某些应用,100ms是最佳的,对于其他应用,潜在的100ms等待会破坏吞吐量.因此,改变并衡量您的性能指标(如果您的应用程序将部署在数据中心的许多核心上,请不要忘记功耗:)).
最后,你可以得到一个混合解决方案,旋转一定数量的迭代,并在没有任何东西到来时求助于(增加)间隔轮询.这将很好地支持突发中发生高负载的服务器应用程序.
归档时间: |
|
查看次数: |
4300 次 |
最近记录: |