0

複数のスレッド/プロセス間で共有される (固定サイズの) 配列があるとします。

配列内の特定の位置から読み書きしたいだけの場合に、配列全体へのアクセスをロックする必要がないように、ロック/ミューテックス用の (一般化された、最適に軽量な) メカニズムはありますか?

強引なアプローチは、配列内の各要素に対して 1 つのミューテックスを単純に持つことです。ただし、これは少し太りすぎのようで、別の解決策を探しています。

私が何を意味するかを示すための短い例:

//Setup
int a[50];

void threada()
{
   lock(a,4); //supposed to lock index 4 of array a from access by other threads
   write(a,4); //writes something to index 4
   unlock(a,4); 
}

void threadb()
{
   //now all of this shouldn't block, since i'm accessing index 5, not 4
   lock(a,5); //supposed to lock index 5 of array a from access by other threads
   write(a,5); //writes something to index 5
   unlock(a,5);
}

void threadc()
{
   //all of this, however, should block if threada is already accessing it
   lock(a,4); //supposed to lock index 4 of array a from access by other threads
   write(a,4); //writes something to index 4
   unlock(a,4);
}
4

1 に答える 1

2

あなたが言及した2つの方法の間で単にトレードオフを持つことができます。それぞれがアレイのセクションを保護するロックの数を少なくします。つまり、それぞれがN/Kアイテムを保護するKロックです。

次に、アプリケーションのデータアクセスパターンに応じて、ストライプを使用できます(つまり、ロック0はインデックス0、K、2K、...を保護します。ロック1インデックス1、K + 1、2K + 1、...など。 )または連続した戦略。

于 2012-07-24T11:54:29.443 に答える