提升spsc队列段错误

时间:2015-10-14 08:35:46

标签: c++ boost

我尝试过使用products.service.company.int。当与boost::lockfree::spsc_queue一起使用时,偶尔会发现segfault。整个类型是:

std::vector<uint16_t>

调试显示,spsc_queue<vector<uint16_t>, boost::lockfree::capacity<1000>> queue; 上发生了段错误,这是以这种方式组织的:

pop
spsc_queue上的

Documentation说:

  

bool vector<uint16_t> vec; while(!done) while(quuee.pop(&vec)){ /* do staff */} (T&amp; ret);

     

从ringbuffer中弹出一个对象。

但是,当我使用

pop

Segfault神奇地消失了。 这让我想到,vector<uint16_t> vec; while(!done) while(quuee.pop(&vec,1)){ /* do staff */ } 试图以某种方式尝试恢复尽可能多的项目。

我是否正确使用此容器?这个问题应该只发生在类似矢量的容器上吗?这个工作人员很少使用,所以它是错误的吗?当我用向量时,我可以面对什么警告?

1 个答案:

答案 0 :(得分:1)

  

Segfault神奇地消失了。这让我想到,bool pop(T&amp;)以某种方式尝试恢复尽可能多的项目。

那神奇的想法。这不是真的

  

我是否正确使用此容器?

我们无法告诉你,因为你没有表明你是如何使用它的。 (只有片段)

  

这个问题应该只发生在类似矢量的容器上吗?这个工作人员很少使用,所以它是错误的吗?

再次神奇的思考

  

当我将它与矢量一起使用时,我可能会遇到什么警告?

与其他类型相同:您是否违反了线程不变量?你是从1个单独的线程读取,并从1个单独的其他线程写入的吗?

<强>更新

感谢您添加SSCCE。

这确实是一个微妙的使用错误(我之前错过了)。您已将指针传递给value,并且队列元素类型可转换为该值。

这意味着单值重载不适用。

的重载是单个参数重载OutputIterator

template<typename OutputIterator> 
  boost::disable_if< typename is_convertible< T, OutputIterator >::type, size_type >::type 
  pop(OutputIterator it);
     

将对象弹出到输出迭代器

     

注意

     
      
  • 线程安全且无需等待
  •   
     

需要:

     
      
  • 只允许一个线程将数据弹出到spsc_queue
  •   
     

返回:

     

弹出项目的数量

糟糕。你在那里调用UB,因为它将分配给&value+1等。这确实导致std::vector::assign大声哭泣。