我在TBB forum上问了这个问题,但我希望有人可能会有一些额外的想法。我正在调试我们看到的问题并注意到tbb::concurrent_vector
的一些奇怪行为。
最重要的是,在push_back()
电话实际完成后,size()
的{{1}}并未反映此情况。我已将其缩小为与容量相关,因为如果我捕获concurrent_vector
和capacity()
,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()
返回。