我尝试过使用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上的
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 */
}
试图以某种方式尝试恢复尽可能多的项目。
我是否正确使用此容器?这个问题应该只发生在类似矢量的容器上吗?这个工作人员很少使用,所以它是错误的吗?当我用向量时,我可以面对什么警告?
答案 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
大声哭泣。