Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Boost_lockFree_SPSC_queue真的是可变大小且无数据丢失吗?

Boost_lockFree_SPSC_queue真的是可变大小且无数据丢失吗?
EN

Stack Overflow用户
提问于 2016-12-07 15:26:05
回答 1查看 285关注 0票数 1

您好,我已经计划使用boost SPSC队列。我必须有一个侦听器,它总是侦听传入的消息,一旦收到,它会将消息放入队列中,然后返回,再次等待新消息。并且有一个消费者从队列中弹出消息并对其进行处理。

因为我不想让我的侦听器等待锁写入队列,所以我更喜欢boost_lockfree_spsc_queue。我相信,如果我在初始化队列时设置fixed_sized<false>,那么队列的大小是不同的。但似乎并非如此。

以下是我的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
boost::lockfree::spsc_queue<int, boost::lockfree::fixed_sized<false>> lockFreeQ{10};

void sharedQueue::lockFreeProduce()
{

    for(int i = 0; i < 100; i++)
    {
       lockFreeQ.push(i);        
       cout<<"--"<<i<<endl;
    }

}
void sharedQueue::lockFreeConsume(){

for(int i = 0;  i <100; i++){

   /* Implement a blocking pop to the queue in order to waste cpu time  by busy waiting*/

        while(!(lockFreeQ.read_available() > 0))
           {
               //std::this_thread::yield();
                 std::this_thread::sleep_for(std::chrono::nanoseconds(10));
           }

       cout<<"   ***"<<lockFreeQ.front()<<endl;
       lockFreeQ.pop();

   }

}

void sharedQueue:: TestLockFreeQueue()
{

   std::thread t1([this]() { this->lockFreeProduce(); });
   std::thread t2([this]() { this->lockFreeConsume(); });   
   t1.join();
   t2.join();
}

输出显示了数据的丢失。以下是部分结果。但是它遗漏了87,比如92。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
**85
***86
***88
***90
***91
***93
***95
***96
***98

如果它是可变大小的,它应该扩展队列的大小,并且不应该丢失数据。它似乎覆盖了解释过的A consequence of the circular buffer is that when it is full and a subsequent write is performed, then it starts overwriting the oldest data.的数据。在这种情况下,如何在不丢失数据的情况下处理此问题?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2016-12-08 19:16:53

将评论翻译为答案。

该策略对spsc_queue的作用方式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typedef typename mpl::if_c<runtime_sized,                                  
                           runtime_sized_ringbuffer<T, allocator>,
                           compile_time_sized_ringbuffer<T, capacity>
                          >::type ringbuffer_type;

在您的示例中,它选择runtime_sized_ringbuffer缓冲区而不是compile_time_sized_ringbuffer

两者之间的区别是,在runtime_sized_ringbuffer的情况下,大小的数组(作为参数传递给构造函数)是使用作为模板参数传递的allocator分配的,而在compile_time_sized_ringbuffer的情况下,数组是在堆栈上分配的。

因此,如果您的队列很大,则必须使用runtime_sized_ringbuffer来代替compile_time_sized_ringbuffer

这是唯一的区别,在这两种情况下,底层数据结构都是circular_buffer。也就是说,即使是在runtime_sized_ringbuffer的情况下,一旦你完成了对缓冲区中所有位置/索引的写入,最旧的元素也会被覆盖。从下面的代码看,这是非常直接的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static size_t next_index(size_t arg, size_t max_size)
{
  size_t ret = arg + 1;
  while (unlikely(ret >= max_size))
    ret -= max_size;
  return ret;
}

如果您确实需要一个无锁列表数据结构,那么您应该看看由Dmitry Vyukov编写的著名的无锁列表数据结构

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41021283

复制
相关文章
Java 中的 String 真的是不可变吗?
我们都知道 Java 中的 String 类的设计是不可变的,来看下 String 类的源码。
java思维导图
2019/11/04
8960
Java 中的 String 真的是不可变的吗?
我们都知道 Java 中的 String 类的设计是不可变的,来看下 String 类的源码。
Java技术栈
2019/07/12
8990
Java 中的 String 真的是不可变的吗?
JAVA中的String真的不可变吗
我们都知道,String是不可变对象,即一旦创建,那么就不能改变它的状态。对此,我们来分析一波。
acupt
2019/08/26
5250
String 的不可变真的是因为 final 吗?
String 为啥不可变?因为 String 中的 char 数组被 final 修饰。这套回答相信各位已经背烂了,But 这并不正确!
飞天小牛肉
2021/04/09
5880
String 的不可变真的是因为 final 吗?
关于 Java 的可变参数你真的了解吗?
我们都知道 Java 支持可变参数的形式定义方法,这种语法糖在某些时候可以简化我们的代码,但是关于可变参数是如何实现的以及其他的更多细节,你真的知道吗?今天阿粉就带你来了解一下。
Java极客技术
2022/12/04
5150
关于 Java 的可变参数你真的了解吗?
【小家java】final修饰的变量真的不可变吗?
这可能是大家的一个共识:如果我们希望这个变量不可变,我们可以用final进行修饰。但本篇将带你深入了解不变的含义,我相信可以让你更深的了解final的原理,也能记得更牢靠
YourBatman
2019/09/03
9000
【小家java】final修饰的变量真的不可变吗?
区块链真的是神话吗?
大家知道,区块链的几个优势是“透明、合约、不可篡改”,但这些所谓的优势,在某些情境下或许并是优势,并不一定适合各行各业。
链圈小姐姐
2018/07/03
1.5K0
什么是可变对象吗?用图说话
列表(list)是一个可变容器,可变与不可变是一对很微妙的概念,因为网上经常出现,所以再重点总结下。
double
2019/12/05
3520
什么是可变对象吗?用图说话
「R」对象大小——R存储真的会占很大空间吗?
在上一篇文章中介绍过列表存储的不是实际的值,而是指向值的引用,所以一个列表的大小比我们预期的可能要小的多。
王诗翔呀
2020/07/06
8530
Serverless:这真的是未来吗?(一)
许多开发人员说,无服务器是计算的未来,而其他开发人员说,它永远不会成功。 我们自己的观点没有那么两极分化。我们将无服务器视为一种选择,这是从初创企业到中型企业,再到大型企业的一个可能的垫脚石。 在这两篇博文中,我们将讨论无服务器如何适应这一过程,以及它的优点和缺点。
donghui
2021/04/07
8070
Serverless:这真的是未来吗?(一)
IT真的是万能的吗?
朋友最近郁闷了,作为企业信息化主管的他最近经常听到的一句话就是:IT是万能的,不能拒绝用户的任何需求。这句话如果是普通用户私下开玩笑说说也就罢了,但现在演变成了老板在会议场合不止一次这么说,那就让人匪夷所思了。
SAP梦心
2018/06/05
1.4K8
IT真的是万能的吗?
Redis真的是单线程吗?
Redis,全名REmote DIctionary Server,开源的高性能的KV内存数据库,支持数据持久化。 开源的支持多种数据结构的基于键值的存储服务系统,高性能、功能丰富。
JavaEdge
2022/11/30
8130
Redis真的是单线程吗?
Serverless:这真的是未来吗?(二)
在关于无服务器的第二篇文章中,我们将讨论一些更广泛的问题。 再次强调,我们并不是要做硬性规定。 我们想提出一些观点,以促进所有利益相关者之间的讨论。 许多说所有应用程序都将是无服务器的应用程序的人并未大规模运行其应用程序,也未解决与延迟、复杂性和供应商锁定有关的所有问题。 这就是我们在这里要谈论的。
donghui
2021/04/12
5480
Serverless:这真的是未来吗?(二)
你真的理解Java 字符串的不可变性吗?
下面看一个奇怪的现象:在程序一段程序的最后执行下面的语句居然打印了 “aw” 为什么?
明明如月学长
2021/08/31
3910
SEO功夫在站外是真的吗?
在早期我们做SEO的时候,经常会听到这样一句话:SEO功夫在站外,实际上,这是一个非常有争议的话题,我们都非常清楚,SEO是一个综合性的运营指标。
蝙蝠侠IT
2020/12/10
6150
SEO功夫在站外是真的吗?
区块链游戏真的是无懈可击的吗?
区块链技术的兴起和演进,甚至有点咄咄逼人。面对区块链游戏的来势汹汹,对于游戏玩家来说,这是属于“红利”般的消息,但是对于传统网络游戏而言,“鸭梨山大”。
陌上花开2018
2018/07/07
2.7K0
区块链游戏真的是无懈可击的吗?
这真的是你了解的网络吗?
无论是 C/S 开发还是 B/S 开发,无论是前端开发还是后台开发,网络总是无法避免的,数据如何传输,如何保证正确性和可靠性,如何提高传输效率,如何解决会话管理问题,如何在网络拥堵环境下采取措施。这些都是需要了解的。
谭庆波
2018/08/10
8450
这真的是你了解的网络吗?
什么是线程安全,你真的了解吗?
记得今年3月份刚来杭州面试的时候,有一家公司的技术总监问了我这样一个问题,说你给我说说有哪些线程安全的类,我心里一想,呵呵,这我早都背好了,稀里哗啦说了一大堆,那你再来说说什么是线程安全,然后就GG了,说真的,我们整天说线程安全,但是你对什么是线程安全真的了解嘛?说真的,我之前真的是了解甚微,那么我们今天就来聊聊这个问题。
用户1260737
2019/10/14
9770
什么是线程安全,你真的了解吗?
什么是线程安全,你真的了解吗?
我们整天说线程安全,但是你对什么是线程安全真的了解嘛?说真的,我之前真的是了解甚微,那么我们今天就来聊聊这个问题。
Java团长
2018/09/27
8690
什么是线程安全,你真的了解吗?
Adam真的是最好的优化器吗?
Adam 优化器是深度学习中最流行的优化器之一。它适用于很多种问题,包括带稀疏或带噪声梯度的模型。其易于精调的特性使得它能够快速获得很好的结果,实际上,默认的参数配置通常就能实现很好的效果。Adam 优化器结合了 AdaGrad 和 RMSProp 的优点。Adam 对每个参数使用相同的学习率,并随着学习的进行而独立地适应。此外,Adam 是基于动量的算法,利用了梯度的历史信息。基于这些特征,在选择优化算法时,Adam 往往是「当仁不让」。
小白学视觉
2022/04/06
5870
Adam真的是最好的优化器吗?

相似问题

NSString真的是不可变的吗?

30

NumPy ndarray真的是可变的吗?

276

scala:列表真的是不可变的吗?

34

在Java中String*真的*是不可变的吗?

37

Java字符串真的是不可变的吗?

155
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文