5

基本的に私はこれを理解するのに苦労しています: (Bjarne FAQから)

しかし、最新のプロセッサのほとんどは、1 文字の読み書きができず、単語全体を読み書きする必要があるため、c への代入は、実際には「c を含む単語を読み取り、c の部分を置き換え、単語を書き戻す」ことになります。 ' b への代入は似ているため、2 つのスレッドが (ソース テキストによると) データを共有していなくても、2 つのスレッドが互いに破壊する機会はたくさんあります!

では、要素間に 3(7?) バイトのパディングなしで char 配列がどのように存在できるのでしょうか?

4

2 に答える 2

8

Bjarne はこれについて間違っていると思います。少なくとも、彼は物事をかなり単純化しています。最新のプロセッサのほとんどは、最初に完全なワードを読み取らずにバイトを書き込むこと できます。つまり、「あたかも」そうであるかのように動作します。特に、 がありchar array[2];、スレッド 1 のみがアクセスarray[0]し、スレッド 2 のみがアクセスするarray[1] 場合 (両方のスレッドが値を変更している場合を含む)、追加の同期は必要ありません。これは標準で保証されています。ハードウェアがこれを直接許可しない場合、コンパイラは同期自体を追加する必要があります。

上記の「あたかも」に注意することは非常に重要です。最新のハードウェアは、バイト単位ではなく、キャッシュ ライン単位でメイン メモリにアクセスします。ただし、キャッシュライン内の単一バイトを変更するための規定も備えているため、書き戻すときにプロセッサコアはキャッシュ内で変更されていないバイトを変更しません。

于 2013-11-11T10:32:50.620 に答える