2012-02-22 5 views
2

スレッドが10個あり、サブアレイが10個ある場合は、各スレッドがサブアレイの異なる1つで動作するのは安全ですか?スレッド[0]は配列[0]への処理を行い、スレッド[1]は配列[1]への処理を行います。これは安全ではありませんか?ベクトルまたは配列(またはそのデータセット)であれば違いがありますか?異なるスレッドで異なるサブアレイにアクセスすることは安全ですか?

+0

アレイ内のオブジェクトの大きさはどれくらいですか? – sarnold

答えて

0

10個の小さな配列を含む「マザー配列」を作成し、各スレッドがこれらの配列のうちの1つに排他的にアクセスしている場合、何も悪いことは起こりません。これらの配列の要素のサイズは関係ありません。

配列の代わりにもっと複雑な構造を使用すると、読み込みが何も変更されない場合も安全です。しかし、構造からの単純な読み込み(例えば、何かがキャッシュされ、再編成される)を変更できる場合、並列構造のスレッドが母構造にアクセスすることは問題になります。

それ以外は、トラブルが発生する可能性がある場合は表示されません。

3

はい、安全です。スレッドのどれもがガードや同期なしで他のスレッドへのアクセスを変更しない限り、あなたは安全です。メモリアドレスが互いに非常に近いかどうかは関係ありません。近接は役割を果たさない。重要なことは、共有があるかどうかであり、そうであれば、いずれかのスレッドが共有リソースを変更します。

+0

私はこのように見ています。無限の人が一度に一杯の水を見ることができますが、一人しかそれを飲むことはできません。 –

+0

@セスカーネギー:私はちょうどここにどのように関連しているか分かりません –

+0

プロキシミティは正確性のための役割を果たしませんが、近代的なメモリ階層のおかげで、パフォーマンスのために潜在的に大きな役割を果たすことができます。その効果は「偽の共有」として知られています。 Herb Sutterからの引用:_ "誤った共有を取り除くためにいくつかの行がゼロスケーリングから完璧なスケーリングにアルゴリズムを要する" _。 –

1

はい、ただし、false sharingに注意してください。

+0

偽の共有に関する面白い読み物。 –

1

本質的にはい - それは配列レベルで安全です(ただし、これは以下にも依存します)。しかし、ツリーや二重リンクリストなどの別の構造であれば、構造を変更しようとすると問題に遭遇する可能性があります。これは、ある要素への変更が安全ではない他の要素への変更を必要とするためです。しかし、あなたがデータを読んでいる限り、あなたはOKであるはずです。 1つの落とし穴は、配列に参照またはポインタが含まれている場合です。この場合、別々の配列エントリにアクセスしている間に、メモリ内の同じ領域を直接的または間接的に参照することがあります。その場合、適切な同期を実行する必要があります。

したがって、1つの単語に:それがintまたは別の単純なデータ型の配列であれば、あなたは完全に安全です。配列ではないか、要素が完全にインプレースではなくポインタや参照を含む場合は、注意が必要です。

関連する問題