一个使用 C++11 编写的有界单生产者单消费者无等待和无锁队列
SPSC 队列.h 用C++11书写的单生产者单消费者无等和无锁固定大小队列. 这个执行速度快于两个助推:lockfree::spsc and foolly:Producer ConcerQuee. 示例... cpp # 包括模板结构分配符 {使用值类型= T; struct GroupResult { T ptr; sizet count; }; 大小整齐( smet n) {返回 (( ((n-1) 21) + 1) (mmap(nultr, proTREAD Q ProWRITE, MAPPRIVATE Q MAPANONUMUS | MAPHUGETLB, - 1, 0) 如果 (p MAPFAILED) { pt: badalloc () ; } 返回 {p, 计数/ smign) { munmap(p, tuneup (size (T) n) );} ; 有关如何在 Linux 上使用庞大页面的完整示例, 请参看 sc/SCQueexplugeHugepp 。 执行情况 其基础实施基于环缓冲. 已注意避免任何虚假分享的问题。 头和尾指数与假共享范围(cache行大小)对齐并相加. 此外,插槽缓冲器在起端和起端加上了假共享范围,从而防止了与相邻任何分配器的假共享. 通过在写作者和读者中分别将头部和尾部指数夹住,这种执行的吞吐量高于典型的并发环缓冲。 缓存通过减少缓存一致性流量来增加吞吐量. 要理解该工作如何首先考虑一个没有缓存的读取操作:需要更新头索引(读取索引),从而将缓存行以独有状态加载到L1缓存中. 需要读取尾部( write index),以检查队列是否为空并因此被装入共享状态的L1缓存. 由于一个队列写入操作需要读取头部索引,所以一个写入操作很可能需要一些缓存一致性流量才能使头部索引缓存行恢复到专属状态. 在最坏的情况下,每次读写操作都会有一个缓存行从共享到独占的过渡. 接下来考虑一个缓存尾部索引的队列读取器:如果缓存尾部索引表明队列是空的,那么就将尾部索引加载到缓存尾部索引. 如果队列没有..
暂无开放 Issues,或尚未同步最近议题。