0

いくつかのスレッドで読み取り/書き込みを行う非常に大きな配列があります。各スレッドは一度に 1 つの要素のみを rw するため、配列全体をロックするのはお勧めできません。私が期待しているのは次のようなものです

// 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_lockですかrelease_lock?

4

1 に答える 1

1

atomicOpenMP を使用する場合、次の構文を使用して同等の動作を得ることができます。

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

そのセマンティクスを理解するために、OpenMP 3.1 標準からの抜粋を次に示します。

アトミックコンストラクトは、不確定な値になる可能性がある複数の同時読み取りおよび書き込みスレッドの可能性にさらされるのではなく、特定のストレージの場所がアトミックにアクセスされることを保証します。

一方、Intel TBB を使用する場合は、atomic テンプレート クラスを参照してください。

于 2013-07-09T16:58:43.113 に答える