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
,我会简单地推回任何新v
上vecOfVec
和检查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地图也同样程度吗?如果没有,请解释.干杯!
我认为,这不是线程安全的.如果一个线程将一个新元素推送到向量上,导致向量的内部存储区域需要增长,会发生什么?推送线程可能会将内存更换为更大的缓冲区,这会导致与此操作并行读取的线程突然从无效(内存)内存中读取.或者线程在某些槽中看到随机值,只是因为它们同时读取代码,该代码将向量的内容从旧内存位置复制到新内存位置.
归档时间: |
|
查看次数: |
2062 次 |
最近记录: |