我在TBB 论坛上问过这个问题,但我希望这里的人可能有一些额外的想法。我正在调试我们看到的一个问题,并注意到来自tbb::concurrent_vector
.
底线是push_back()
调用实际完成后,size()
的concurrent_vector
并没有反映这一点。我已将其范围缩小为与容量相关,因为如果我捕获capacity()
and size()
,size() == capacity() => true
这使我相信size()
返回的是容量而不是元素的实际数量。
我创建了一个简单的程序来复制这个问题,它最常在向量为空时触发。为简单起见,该程序只是在调用返回size() != 0
后立即断言。push_back()
我希望有人能告诉我这是预期的行为还是错误。
#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();
}
}
根据他们的参考手册:
push_back() "将值的副本附加到向量的末尾。"
和
size() 返回“向量中的元素数。结果可能包括已分配但仍在通过并发调用任何增长方法 (5.6.3) 构建的元素。”
基于此,我认为至少size()
应该体现一次回报。push_back()
push_back()