我试图把一个(非常)大的矢量,并将其中的所有值重新分配到多维(2D)矢量>中。正在向多维向量中的子元素写入线程安全的元素吗?
为了避免重新分配,多维向量的两个维都调整为正确的大小,以避免重新分配。
目前,我正在做它单线程,但它是需要重复发生的事情,并且由于大尺寸(〜7秒)非常缓慢。问题是,对于我来说,是否对于每个2D元素使用线程是否是线程安全的。
一些伪代码:
vector<string> source{/*assume that it is populated by 8,000,000 strings
of varying length*/};
vector<vector<string>> destination;
destination.resize(8);
for(loop=0;loop<8;loop++)destination[loop].resize(1000000);
//current style
for(loop=0;loop<source.size();loop++)destination[loop/1000000][loop%1000000]=source[loop];
//desired style
void Populate(int index){
for(loop=0;loop<destination[index].size();loop++)destination[index][loop]=source[index*1000000+loop];
}
for(loop=0;loop<8;loop++)boost::thread populator(populate,loop);
我认为该线程版本应该工作,因为他们正在写分隔第二维元素。但是,我不确定编写字符串是否会破坏事情,因为它们正在调整大小。
非常感谢您对所有评论的清晰深入的解释以及一些需要注意的细节。 在我的情况下,每个线程都会获得2D矢量的整个分支,所以不用担心范围碰撞,但对其他情况很了解。 对于内存和缓存问题,我只需要测试它来确定我的情况下的效率。但指出多线程并不总是一个神奇的子弹是一件好事。 –