7

C ++ 11のドラフトを読んで、1.7.3節に興味がありました。

メモリ位置は、スカラータイプのオブジェクト、またはすべてゼロ以外の幅を持つ隣接するビットフィールドの最大シーケンスのいずれかです。...実行の2つのスレッド(1.10)は、互いに干渉することなく、別々のメモリ位置を更新してアクセスできます。

この条項は、次のようなハードウェア関連の競合状態から保護しますか?

  • 2つのバストランザクションでメモリが更新される非整列データアクセス(メモリティアリング)?
  • システムメモリユニット内に個別のオブジェクトがあります。たとえば、32ビットワードに2つの16ビット符号付き整数があり、個別のオブジェクトを個別に更新するたびに、メモリユニット全体を書き込む必要があります(メモリの競合)。
4

2 に答える 2

5

2点目については、規格ではレースがないことが保証されています。そうは言っても、この保証は現在のコンパイラでは実装されておらず、一部のアーキテクチャでは実装できない可能性さえあると言われています。

最初のポイントに関しては、2番目のポイントが保証されていて、プログラムに競合状態が含まれていない場合、当然の結果として、これも競合状態にはなりません。つまり、標準では異なるサブワードの場所への書き込みが安全であることが保証されているため、競合状態になる可能性があるのは、複数のスレッドが同じ変数にアクセスする場合(つまり、ワード間で分割されている場合、またはおそらくこれは、キャッシュライン全体で問題になる可能性があります)。

繰り返しますが、これを実装するのは難しいか、不可能ですらあります。アラインされていないデータがキャッシュラインを通過する場合、パフォーマンスに多大なコストをかけることなく、コードの正確性を保証することはほとんど不可能です。これと他の理由(生のパフォーマンスを含む、2つのキャッシュラインに接触するオブジェクトへの書き込みには32バイトものメモリへの書き込みが含まれ、他のスレッドがキャッシュライン、それはまたキャッシュの同期のコストを含みます...

于 2012-06-05T12:39:59.213 に答える
2

2つのスレッドが同じメモリ位置にアクセスする場合にのみ表示されるメモリのティアリングからは保護されません(ただし、この句は別々のメモリ位置にのみ適用されます)。

あなたの例によれば、それはメモリの競合から保護しているように見えます。これを実現する最も可能性の高い方法は、一度に32ビット未満を書き込めないシステムは32ビットcharであり、2つの別々のオブジェクトが「システムメモリユニット」を共有できないことです。(32ビットのシステムで2つの16ビット整数を隣接させることができる唯一の方法charは、ビットフィールドとしてです。)

于 2012-06-05T12:38:08.893 に答える