私は多数の整数のセットを持っており、それらをポインターのベクトルに入れています。競合状態を引き起こすことなく、これらの整数のセットを並行して更新できる必要があります。すなわち。私はOpenMPの「parallelfor」構造を使用しています。
共有リソースを処理するために、OpenMPは便利な「アトミックディレクティブ」を提供します。これにより、ロックを使用せずに特定のメモリの競合状態を回避できます。「アトミックディレクティブ」を使用して整数セットが同時に更新されないようにすると便利ですが、これが可能かどうかはわかりません。
基本的に、次のコードが競合状態につながる可能性があるかどうかを知りたいです
vector< set<int>* > membershipDirectory(numSets, new set<int>);
#pragma omp for schedule(guided,expandChunksize)
for(int i=0; i<100; i++)
{
set<int>* sp = membershipDirectory[rand()];
#pragma omp atomic
sp->insert(45);
}
私のアプリケーションでは、任意のスレッドが任意のインデックスにアクセスする可能性があるため、インデックスにランダムな整数を使用していることに注意してください(大きなアプリケーションにはランダムな要素がありますが、詳細に立ち入る必要はありません)。
整数をインクリメントするためのこれと同様の例を見てきましたが、私の場合のようにコンテナーへのポインターを操作するときに機能するかどうかはわかりません。