SPSCQueue 单一消费者等待和无锁定大小队列开源项目

我要开发同款
匿名用户2019年05月17日
34阅读
开发技术C/C++
所属分类程序开发、常用工具包
授权协议MIT

作品详情

SPSCQueue是用C++11编写的单个生产者单一消费者等待和无锁定大小队列。

示例代码SPSCQueue<int>q(2);autot=std::thread([&]{while(!q.front());std::cout<<*q.front()<<std::endl;q.pop();});q.push(1);t.join();使用

SPSCQueue<T>(size_tcapacity);

Createa SPSCqueue holdingitemsoftype T withcapacity capacity.Capacityneedtobegreaterthan2.

voidemplace(Args&&...args);

Enqueueanitemusinginplaceconstruction.Blocksifqueueisfull.

booltry_emplace(Args&&...args);

Trytoenqueueanitemusinginplaceconstruction.Returns true onsuccessand false ifqueueisfull.

voidpush(constT&v);

Enqueueanitemusingcopyconstruction.Blocksifqueueisfull.

template<typenameP>voidpush(P&&v);

Enqueueanitemusingmoveconstruction.Participatesinoverloadresolutiononlyif std::is_constructible<T,P&&>::value==true.Blocksifqueueisfull.

booltry_push(constT&v);

Trytoenqueueanitemusingcopyconstruction.Returns true onsuccessand false ifqueueisfull.

template<typenameP>voidtry_push(P&&v);

Trytoenqueueanitemusingmoveconstruction.Returns true onsuccessand false ifqueueisfull.Participatesinoverloadresolutiononlyif std::is_constructible<T,P&&>::value==true.

T*front();

Returnpointertofrontofqueue.Returns nullptr ifqueueisempty.

pop();

Dequeuefirstelmentofqueue.Invalidtocallifqueueisempty.Requires std::is_nothrow_destructible<T>::value==true.

一旦一个单一的写线程可以执行入队列的操作时,只有一个单一的读线程可以执行取队列操作,其他的使用都是不允许的。

实现原理

底层实现是一个环形缓冲区。

参考资料:

Intel. AvoidingandIdentifyingFalseSharingAmongThreads.Wikipedia. Ringbuffer.Wikipedia. Falsesharing.性能测试

以下测试结果是基于 2socketmachinewith2xIntel(R)Xeon(R)CPUE5-26200@2.00GHz.

NUMANode/Core/Hyper-ThreadThroughput(ops/ms)LatencyRTT(ns)#0,#0,#0&#0,#0,#16394260#0,#0,#0&#0,#1,#037739238#0,#0,#0&#1,#0,#0
声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论