【发布时间】:2017-03-07 09:41:03
【问题描述】:
我需要填充一个矩阵 (std::vector< std::vector<T> >),其行数和列数是已知的,并且已经使用 vector::resize( ... ) 函数设置。
每个矩阵元素的对象都是class T 的对象,它们应该有一个std::set<int> 作为其中的成员。无法提前知道这些集合的大小。
为了填充矩阵,我打算使用如下循环,其中 m、n 是已知数字:
std::vector< T > innerVector;
innerVector.resize( n, T() );
std::vector< std::vector< T > > myMatrix;
myMatrix.resize( m, innerVector );
#pragma omp parallel for
for( size_t i = 0; i < myMatrix.size(); ++i )
{
for( size_t j = 0; j < myMatrix.at(0).size(); ++j )
{
fillMatrix( myMatrix, i, j);
}
}
fillMatrix( ... ) 函数只使用已知信息来构建包含在每个矩阵元素中的数字集,因此没有数据依赖性。
像这样填充矩阵,我们不会遇到由多个线程一次访问矩阵元素引起的竞争条件。我的问题是在不使用omp critical 环境的情况下调用fillMatrix( ... ) 函数是否安全。
关键是我不知道vector::resize( ... ) 函数是如何工作的。不知何故,它为myMatrix 分配了一些内存,但由于class T 的元素大小未知,我可以想象遇到这种情况,最初为矩阵元素分配的内存是不够的。那会发生什么?是否有可能多个线程(即填充不同矩阵条目的线程)尝试使用相同的地址扩展分配的内存?
【问题讨论】:
标签: c++ multithreading matrix memory-management openmp