2017-08-16 28 views
5

2つのスレッドが同じ配列の要素を変更できるかどうか疑問に思っていました。私はunsigned char array[4]を持っている場合は2つのスレッドが同じ配列の異なる要素に書き込むことはできますか?

は、「A」にarray[0]array[1]を設定するスレッド1ができ、スレッド2は問題なく、同時に「B」にarray[2]array[3]を設定しますか?

+1

同じ*絶対*メモリの場所は、常に複数のスレッドで変更できます。 – JosephDoggie

+0

あなたは同じアドレス空間を設定していないので、私はマルチスレッドの問題に遭遇するとは思わない。 – user3400223

+0

これはアーキテクチャによって異なります。どのプロセッサを使用していますか? – templatetypedef

答えて

2

定義することにより、競合状態は、(起こりまたはそれに書き込むこともできます)。異なる配列要素をそれぞれ変更する複数のスレッドがメモリ内の同じ場所に書き込まれますか?答えはいいえだ。各配列要素には、全体の配列に割り当てられた領域内のメモリ領域のみが予約されています。したがって、異なる要素の修正は、同じメモリ位置のいずれにも書き込まない。

実際に私はこの質問を非常に長い時間前にhereと尋ねました。それに基づいて私のPhDの作業に基づいています。私は並列に数百の曲線(最小二乗適合)を適用し、複数のスレッドによる結果を持つ単一の配列を更新しました。

+1

同じ場所への複数の書き込みは、標準の「データ競合」の定義によって、並行読者なしで、単独でデータ競合を生成することができます。それ以外にも、私は、この回答は提起された質問に関して正しいと思うが、その言葉は非常に混乱している。おそらく、あなたは「* 1つの配列の異なる要素のために...」と言っていますか? –

+0

@JohnBollingerあなたが正しいです。しかし、私は読書よりももっと厳しいものを書いていると考えています。なぜ読書がレースを引き起こしたのか、そして確かに書いているのです(私は自分の答えを修正/改善しました)。私はあなたの提案を理解できませんでした。編集を提案し、私の答えを修正します。 –

+0

私は実際に編集を提案しました。あなたがそれを気に入らなければ、さらに編集するか、元に戻す。私は最初の試みが私の意図を適切に伝えていないので、それはかなり大きな変化だから最初にこれをすることをためらったが、同じ理由で、そのような編集をもっとコンパクトにする方法はわからない。 –

1

私が会ったすべてのシステムでは、同じスレッドの異なる要素に異なるスレッドを書き込む機能的な問題はありません。しかしながら、いくつかのシステムでは、異なるコア上のスレッドが同じキャッシュライン内のデータにアクセスするため、パフォーマンス上の問題が発生することがあります。 HWは機能部分を解決しますが、パフォーマンスは悪い可能性があります。

あるスレッドが別のスレッドによって書き込まれたデータを読み取るまで、機能上の問題は開始しません。その時点で、書かれたデータが他のすべてのスレッドに確実に表示されるように、メカニズム(たとえば、mutex、セマフォ、アトミック操作など)が必要です。

1

スレッドが同じコア上で実行される場合、シリアル書き込みプロセスとなり、別のバイトを1つのスレッドで「線形」コードと同じように設定します。しかし、あなたは必ずしもどのような順序で(通常の場合)知っているとは限りません。何スレッドがどのような順序で実行されているかを意味します。

ただし、書き込みが2つの異なるコアから発生する場合、キャッシュラインはそれぞれのコアキャッシュ間で共有とマークされ、書き込み操作はRFOメッセージを使用してアナウンスされます。それはパフォーマンスに影響します。

つまり、できるだけ同じコアの同じキャッシュラインに書き込みを維持します。

情報はここで見つけることができる詳細 - 他の人がそれから読み出しながら、1つの以上のスレッドがメモリ内の同じ位置にデータを書き込む場合> What Every Programmer Should Know About Memory

/アンダース

関連する問題