C++ STL地图/矢量和线程安全矢量

hop*_*pla 3 c++ containers boost stl thread-safety

我想知道下面的代码是否会被认为是线程安全的.我认为它应该是,但我不太熟悉引擎盖下发生的事情.

基本上,我在类Foo中有这个函数,它将在主线程上调用并将一个向量作为一个anrgument,即

void Foo::func( vector<int> v)
Run Code Online (Sandbox Code Playgroud)

在Foo,我也有一个私人会员,

vector< vector<int> > vecOfVec;
Run Code Online (Sandbox Code Playgroud)

func,我会简单地推回任何新vvecOfVec和检查v的规模.如果v小于其预期的大小,我想开始另一个填充了v一些已知的预定值的线程,如此

void Foo::func( vector<int> v)
{
    int size = v.size();
    int index = vecOfVec.size();

    vecOfVec.push_back(v);

    if (size < 1000)
    {
        boost::thread t( boost::bind( &Foo::PushBackZeros, this, vecOfVec, index) );
    }
}
Run Code Online (Sandbox Code Playgroud)

Foo::PushBackZeros 就像它的名字所暗示的那样,用'零填充'vecOfVec [index]'的向量,直到它的大小增加到1000;

现在,我没有在任何元素上看到任何并发读或写操作vecOfVec.显然,有可能对整个对象进行并发操作,但永远不会有特定元素的并发vecOfVec.

有人可以解释上述是否会被认为是线程安全的吗?STL地图也同样程度吗?如果没有,请解释.干杯!

Dir*_*irk 8

我认为,这不是线程安全的.如果一个线程将一个新元素推送到向量上,导致向量的内部存储区域需要增长,会发生什么?推送线程可能会将内存更换为更大的缓冲区,这会导致与此操作并行读取的线程突然从无效(内存)内存中读取.或者线程在某些槽中看到随机值,只是因为它们同时读取代码,该代码将向量的内容从旧内存位置复制到新内存位置.