2011-03-22 88 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

相關問題