在并行节点插入中访问 size() 时 tbb::concurrent_vector 中的竞争条件

问题描述 投票:0回答:1

我正在使用

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;
}
c++ concurrency tbb
1个回答
0
投票

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));
}
© www.soinside.com 2019 - 2024. All rights reserved.