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

时间:2015-06-30 22:16:59

标签: c++ multithreading c++11 vector stl

我正在阅读来自此link的各种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(),equal_range(),at(),以及除外   关联容器,operator [],表现为const的目的   线程安全性(也就是说,它们也可以同时被调用   同一容器上的不同线程)。更一般地说,C ++   除非那些对象,否则标准库函数不会修改对象   可以通过函数的非const直接或间接访问   参数,包括this指针。

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

1 个答案:

答案 0 :(得分:8)

根据C ++ 03标准询问某些东西是否是线程安全的是没有意义的 - C ++ 03和早期没有任何线程或线程安全的概念。

只要没有两个线程传递ChangeValue的相同参数,

index就是无数据竞争(由C ++ 11及更高版本定义),否则传递相同参数的调用将被同步通过某种方式在函数外部相互使用。