原子std :: vector :: push_back()并返回索引

Agn*_*ian 5 c++ multithreading stl 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Kir*_*sky 11

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;
}
Run Code Online (Sandbox Code Playgroud)

您需要以这种方式保护任何读/写操作.另一种方法是为它创建包装类,std::vector它将通过线程支持扩展它.查看问题了解详情.

  • 需要保护任何读/写操作.可能是OP应该为`std :: vector`创建包装类,它将通过线程支持扩展它.有关详细信息,请查看[this](http://stackoverflow.com/questions/1099513/threadsafe-vector-class-for-c)问题. (4认同)