我正在使用
tbb::concurrent_vector nodes_
并行地将多个节点添加到树中。当我尝试返回nodes_.size()
时,问题就出现了。当两个线程同时添加节点时,会出现竞争条件,导致 nodes_.size()
返回不正确的值。
虽然我可以使用互斥体来解决这种竞争条件,但它会抵消并行添加节点的好处,从而使
concurrent_vector
变得不必要。
有没有办法继续使用
concurrent_vector
,同时避免使用 size()
的竞争条件?
这是我的代码的简化版本,由多个线程并行运行
int PTree::makeNode(int item) {
nodes_.push_back(PNode(item));
return nodes_.size() - 1;
}
在
tbb:concurrent_vector
中使用 size()
查找您推送的最后一个元素的位置是错误的,您不能以原子方式执行这两个操作,而是使用 push_back()
返回的迭代器
int PTree::makeNode(int item) {
auto it = nodes_.push_back(PNode(item));
return static_cast<int>(std::distance(nodes_.being(), it));
}