c++ - 原子地 std::vector::push_back() 并返回索引

标签 c++ multithreading stl vector

我需要创建一个函数,将一个值附加到 vector 并返回刚刚附加的值的索引。

例子:

int append(std::vector<int>& numbers, int number){
  int retval = numbers.size();
  // what if some other thread calls push_back(number) in between these calls?
  numbers.push_back(number);
  return retval;
}

我想以原子方式执行此操作,以便返回的索引始终正确,即使可能有多个线程将值附加到 vector 。如果 push_back 返回刚刚添加的项目的索引,那会很容易。如何保证返回正确的索引?

最佳答案

std::vector 没有内置线程支持。您可以使用 boost::mutex 来扩展它:

int append(std::vector<int>& numbers, int number){
  boost::mutex::scoped_lock slock( my_lock );
  int retval = numbers.size();
  numbers.push_back(number);
  return retval;
}

您需要以这种方式保护任何读/写操作。另一种方法是为 std::vector 创建包装器类,它将使用线程支持对其进行扩展。检查this询问详情。

关于c++ - 原子地 std::vector::push_back() 并返回索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3447487/

相关文章:

用于 LiFx 控件的 C++ curl POST

ruby - 如何检测 Ruby 线程何时从线程内被杀死

c - 需要关于多写入线程、单工作线程模型的建议

c++ - 为什么 std::pair<const int, int> 不适用于某些 STL 容器?

c++ - 在不同线程中使用map::empty和map::insert

c# - 通过反射从 C# 访问 C++ 非成员函数

c++ - C++中的树类

c++ - 每次成功编译后运行单元测试

c++ - 使用类成员函数初始化 std::barrier

c++ - 使用 hash_map<vector<int>,string> 失败,为什么?