我在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()
回报。