2016-09-27 67 views
0

比方說,我有一個程序的這一小部分:指針用C使用OpenMP

#pragma omp parallel for collapse(2) 
for(ix = 2; ix <= sizep ; ix++){ 
for(iy = 2; iy <= sizep ; iy++){ 
    *(u1+ix*size+iy)=*(u2+ix*size+iy)+*(u2+ix+iy); 
} 
} 

我相信運營商=的變量左邊是「寫」,所以有問題,如果兩個線程訪問的這部分記憶。但是*(u2+ix*size+iy)呢,那部分寫的也是?我的意思是這是否將指針u2移動到正確的內存地址然後讀取此位置?總之,這是安全的並行使用?

回答

1

你對「寫」部分是正確的。即使通過鎖定機制保護寫入也會失敗,如果目標是相同的,因爲值被覆蓋

但是,對於「讀取」部分,您可以始終同時讀取相同的內存地址(並行線程),課程!

在您的示例代碼中,爲了確定讀取地址而執行的所有計算都是在不使用任何寫入全局變量的情況下完成的(實際上它不使用任何本地語言,即使這不會成爲問題)或調用非線程所以計算地址的安全方法是完全線程安全的(使用函數本地/自動內存)。

我希望它能回答你的問題。