我在TBB forum上提出過這個問題,但我希望這裏有人可能會有一些額外的想法。我正在調試我們所看到的問題,並注意到tbb::concurrent_vector
有一些奇怪的行爲。tbb :: concurrent_vector返回錯誤的大小
底線是在push_back()
調用實際完成後,concurrent_vector
的size()
未反映此情況。我已經縮小它與容量有關,因爲如果我捕獲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()
回報。