2013-07-09 38 views
0

我有一個非常大的數組可以被多個線程讀/寫。每個線程一次只能讀取它們中的一個元素,所以鎖定整個數組是一個壞主意。我所期待是一樣的東西如何使用TBB/OpenMP鎖定陣列的元素

// before threads 
lock_t Lock[NUM_THREADS]; 

... 

// during threads 
get_lock(Lock[thread_id], element_id); 
array[element_id]+=10; // some operations 
release_lock(Lock[thread_id]); 

所以我的問題是,什麼是設計get_lockrelease_lock的最佳策略是什麼?

回答

1

當使用OpenMP可以使用atomic結構獲得相等的行爲:

// during threads 
#pragma omp atomic 
array[element_id]+=10; // some operations 

只給你它的語義的想法,這裏是從的OpenMP 3.1標準的摘錄:

原子構造確保特定的存儲位置是原子地訪問,而不是暴露於多個可能的同時讀取和寫入可能導致 不定值

在另一方面線程,如果你決定使用英特爾TBB,你可以去看看atomic template class

+0

很好。我只是把我的思想固定在其他愚蠢的東西上。 – xis