2011-03-22 83 views
1

我在TBB forum上提出过这个问题,但我希望这里有人可能会有一些额外的想法。我正在调试我们所看到的问题,并注意到tbb::concurrent_vector有一些奇怪的行为。tbb :: concurrent_vector返回错误的大小

底线是在push_back()调用实际完成后,concurrent_vectorsize()未反映此情况。我已经缩小它与容量有关,因为如果我捕获capacity()size(),size() == capacity() => true这导致我相信size()正在返回容量而不是实际元素数量。

我已经创建了一个简单的程序来重复这个问题,当矢量为空时最常触发。为了简单起见,该程序在push_back()调用返回后立即立即调用size() != 0。我希望有人能够告诉我这是否是预期的行为或者是否有错误。

#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(); 
    } 
} 

根据他们reference manual

的push_back() “的追加值拷贝到 向量的结束”。

尺寸()返回“在 向量元素的数量。结果可以包括在建由并发呼叫 分配但仍 到任何的生长的方法 元件(5.6.3)。”

在此基础上,笔者认为,应size()至少反映push_back()一次push_back()回报。

回答

1

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

相关问题