1

私の知る限り、コンパイラ(ソフトウェア)とCPU(ハードウェア)はパフォーマンス上の理由から命令を並べ替えますが、メモリバリアは並べ替えを防ぐことができ、コンパイラレベルまたはCPUレベルにあります。

MSDN は、「Interlockedxxxx 関数は、メモリ操作が順番に完了するように完全なメモリ バリア (またはフェンス) を生成します」と述べていますが、「完全なメモリ バリア」がハードウェアまたはソフトウェアのバリアを意味するかどうかはわかりません。

boost::atomic によって何が行われますか? ハードウェアバリア?CPUキャッシュ/ストレージバッファをフラッシュしますか?

memory_order_acquire セマンティックは、ソフトウェアまたはハードウェアの障害になりますか?

4

3 に答える 3

3

使用しているプラ​​ットフォームに必要なバリアを使用して、指定されたメモリ モデルを提供します。

boost::atomicこれは、さまざまなプラットフォームに実装された移植可能な API であることを忘れないでください。一方、Windows デスクトップ API は Intel 上でのみ実行されます。その結果、MSDN ドキュメントにはプラットフォーム固有の情報が含まれますが (x86、x64、Itanium の 3 つのプラットフォームしかないため)、atomicドキュメントには含まれません。

(注: Win32 のほとんどは ARM プロセッサ上の Windows CE でも使用されますが、ドキュメント ページの並列セットがあります。デスクトップ ページは ARM をカバーしていません。また、Windows 8 RT をカバーする「Windows ストア」API は、さらに別のセットです。ドキュメンテーション)

于 2013-08-28T15:12:52.833 に答える
2

によって何が行われboost::atomicますか? ハードウェアバリア?CPUキャッシュ/ストレージバッファをフラッシュしますか?

それは問題ですか?

アトミック操作は、同期関係を確立します。これらの関係によって定義された動作を実現するために、ターゲット マシンで実行する必要があることは何でも実行します。

たとえば、store-release セマンティクスを使用した操作は、load-acquire セマンティクスを使用した操作と同期します。操作 Aが操作 Bと同期している場合、A がB の前にスレッド間で発生すると言われ、これはA が B の前に発生することを意味し、A と B がデータ競合を引き起こさないことを意味します。(同期関係の名前は強調表示されています)

于 2013-08-28T15:13:15.153 に答える