tbb :: concurrent_vector返回错误的大小

时间:2011-03-22 19:17:06

标签: c++ tbb concurrent-vector

我在TBB forum上问了这个问题,但我希望有人可能会有一些额外的想法。我正在调试我们看到的问题并注意到tbb::concurrent_vector的一些奇怪行为。

最重要的是,在push_back()电话实际完成后,size()的{​​{1}}并未反映此情况。我已将其缩小为与容量相关,因为如果我捕获concurrent_vectorcapacity()size()这会让我相信size() == capacity() => true正在返回容量而非实际容量元素数量。

我创建了一个复制此问题的简单程序,当向量为空时,该程序最常触发。为简单起见,此程序只是在size()调用返回后立即ASSERT size() != 0。我希望有人可以告诉我这是否是预期的行为或是否是一个错误。

push_back()

根据他们的reference manual

  

push_back()“将值的副本附加到   向量的结尾。“

  

size()返回“中的元素数量”   矢量。结果可能包括   分配但仍然的元素   正在建设中并行通话   任何增长方法(5.6.3)。“

基于此,我认为#include <boost/thread.hpp> #include <tbb/concurrent_vector.h> typedef tbb::concurrent_vector<int> vec_type; void invokePushBack(vec_type * vec) { for(int i = 0 ; i < 10 ; ++i) { vec_type::iterator it = vec->push_back(1); assert(vec->size() != 0); } } int main() { // note: the race condition doesn't always trigger, // so we loop until it does. while(true) { vec_type vec; boost::thread_group tg; for(int i = 0 ; i < 5 ; ++i) tg.create_thread(boost::bind(invokePushBack, &vec)); tg.join_all(); } } 至少 至少反映size()一次push_back()返回。

1 个答案:

答案 0 :(得分:1)

我最终解决了这个问题。事实证明它是“按设计”的。在concurrent_vector。有关论坛的回复,请参阅this link