1

2 次元配列と、配列に書き込む 8 つの同時スレッドがあります。各スレッドが異なる配列に対して読み取り/書き込みを行うと、セグ フォールトが発生しますか?

例えば:

char **buffer;
//each thread has its own thread ID
void set(short ID, short elem, char var)
{
     buffer[ID][elem] = var;
}

これでよろしいでしょうか?これが疑似コードっぽいことは知っていますが、おわかりでしょう。

4

3 に答える 3

3

各スレッドが異なるサブ配列に書き込む場合、コードのこの側面は問題なく、ロックする必要はありません。

于 2013-03-27T18:15:07.277 に答える
0

複数のスレッドによるメモリへの読み書きは、それ自体ではセグ フォールトを引き起こしません。それができることは、結果が複数のスレッドの操作の順序に不確定に依存する競合状態になることです。結果は、読み取ったメモリをどうするかによって異なります...値を読み取り、それをインデックスとして使用するか、ポインターを逆参照すると、実行された場合にコードのロジックが実行されていても、範囲外のアクセスが発生する可能性がありますたった1つのスレッドではできませんでした。

特定のケースでは、各スレッドが異なる ID を使用するために重複しないメモリに書き込む場合、配列にアクセスするときに競合状態が発生する可能性はありません。ただし、 ID を割り当てるときに競合状態が発生する可能性があり、その結果、2 つのスレッドが同じ ID を受け取ることになります。そのため、ロックを使用するか、それが起こらないことを保証する他の方法を使用する必要があります。

于 2013-03-27T18:40:13.057 に答える
0

注意が必要な主なことは、2D 配列がいつ、どのように割り当てられるかです。ワーカー スレッドが配列へのアクセスを開始する前にすべての割り当てが行われ、各ワーカー スレッドがスレッドの有効期間中、マスター配列の「行」の 1 つだけを読み書きし、それが唯一のスレッドである場合その行にアクセスすると、配列内のエントリにアクセスまたは更新するスレッドの問題は発生しません。

1 つのスレッドのみが行に書き込みを行っているが、複数のスレッドがその同じ行から読み取りを行っている可能性がある場合は、何らかの同期計画を作成する必要があります。そうしないと、同時書き込みによる部分的な書き込みが原因で、読み取り時に一貫性のないデータや一貫性のないデータが表示されることがあります。 .

各ワーカー スレッドがマスター配列内の 1 つの「行」にハード バインドされている場合、各行に必要なメモリをワーカー スレッド自体によって割り当ておよび再割り当てすることもできます。スレッドによって (再) 割り当てられた行データ。このワーカー スレッドだけがそのスロットに関心があるため、メイン配列のポインター スロットに対する競合は発生しません。ワーカー スレッドが開始される前に、マスター配列が割り当てられていることを確認してください。このシナリオでは、C RTL の malloc 実装がスレッド セーフであることも確認してください。(ビルド オプションでスレッド セーフな RTL を選択する必要がある場合があります)

于 2013-03-27T18:43:55.550 に答える