我需要创建一个函数,将一个值附加到 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/