C++11/C++03和std::矢量线程安全

C++11 / C++03 and std::vector thread safety

本文关键字:线程 安全 std C++03 C++11      更新时间:2023-10-16

我从这个链接中了解到各种stl容器的线程安全现在我遇到了这样一点,即C++11只有

可以同时修改同一容器中的不同元素由不同线程执行,std::vector<bool>的元素除外(例如,std::future对象的矢量可以是接收值来自多个线程)

这是否意味着如果我有一个这样的方法,它正被多个同时线程(notice the method does not have any locks)

void ChangeValue(int index , int value)
{
   someVector[index] = value;
}

以上方法安全吗。我的理解是,它只对C++11是安全的。然而,当我看到链接中提到的其他声明时

所有const成员函数都可以由不同的同一容器上的线程。此外,成员的功能begin()、end()、rbegin()、rend()、front()、back()、data()、find(),lower_bound()、upper_bound关联容器,运算符[],出于以下目的表现为常量线程安全性(也就是说,它们也可以由同一容器上的不同线程)。更一般地说++标准库函数不会修改对象,除非这些对象可以通过函数的常量直接或间接访问参数,包括this指针。

我得出的结论是,在C++03中,上述方法也可以安全地使用。请告诉我我的理解是否正确。

在C++03标准下,询问某些东西是否是线程安全的是没有意义的——C++03和更早的版本没有任何线程或线程安全的概念。

只要没有两个线程为index传递相同的参数,或者传递相同参数的调用通过函数外部的某种方式彼此同步,ChangeValue就没有数据争用(如C++11及更高版本所定义的)。