2011-02-16 46 views
1

我想使用pthreads並行化操作。該流程看起來是這樣的:Pthreads和mutexes;鎖定陣列的一部分

double* doSomething(....) { 
double* foo; 
foo = new double[220]; 

for(i = 0; i<20; i++) 
{ 
    //do something with the elements in foo located between 10*i and 10*(i+2) 
} 

return foo; 
} 

的東西for循環中發生了可以按任何順序來完成,所以我想這個組織使用線程。例如,我可以使用多個線程,以便每個線程遍歷for循環的一部分,但是可以在數組的不同部分工作。爲了避免在重疊部分上工作時出現問題,我需要鎖定一些內存。

我該如何製作一個只鎖定數組一部分的互斥體(或別的東西)?

+0

使用`std :: vector `。 – GManNickG 2011-02-16 19:24:02

回答

0

如果循環看起來和你寫的完全一樣,我將使用一個21個互斥體的數組,並在循環開始的第i個第(i + 1)個互斥體上的每個線程中阻塞。

因此,像:

... 
for (i = 0; i < 20; i++) { 
mutex[i].lock(); 
mutex[i+1].lock(); 
... 
mutex[i+1].unlock(); 
mutex[i].unlock(); 
} 

的邏輯是,僅兩個相鄰的循環執行可以訪問相同的數據(如果該限制是[I * 10,第(i + 2)* 10)),所以你只需要擔心他們。

1

如果你只是想確保陣列的部分曾經工作過......

做一個全局變量:

int _iNextSection; 

每當一個線程已經準備好了在區域運行,線程獲取下一個可用的部分是這樣的:

iMySection = __sync_fetch_and_add(&_iNextSection, 1); 

__sync_fetch_and_add()返回_iNextSection的電流值,然後遞增_iNextSection。 __sync_fetch_and_add()是原子的,這意味着__sync_fetch_and_add()保證在另一個線程可以完成之前完成。沒有鎖定,沒有阻塞,簡單,快速。