我試圖把一個(非常)大的矢量,並將其中的所有值重新分配到多維(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矢量的整個分支,所以不用擔心範圍碰撞,但對其他情況很瞭解。 對於內存和緩存問題,我只需要測試它來確定我的情況下的效率。但指出多線程並不總是一個神奇的子彈是一件好事。 –