異なるOSの原子メモリアクセスの明確化
-
09-10-2019 - |
質問
私は現在、学習体験として趣味プロジェクトとしてWindows C ++ライブラリをMacOSに移植しています。 Win Interlocked*関数を使用していくつかのコードに出くわしたので、一般的に主題について読み上げようとしています。
ここで関連する質問を読むので、OSに応じてこれらの操作を行うにはさまざまな方法があることを理解しています。 Windows、osatomic*のインターロック* Macosと私は、コンパイラがこれのために(本質的な)操作を構築していることも発見しました。
読んだあと GCCビルトイン原子メモリアクセス, 、私は疑問に思っています 内因性とosatomic*またはインターロック*の違いは何ですか? つまり、GCCを使用しているときにMacOSを使用している場合、OSATOMIC*またはGCCビルトインのどちらかを選択できませんか? GCCを使用してWindowsにいる場合も同じです。
また、Windowsのインターロック*で、インラインバージョンと本質的なバージョンの両方として表示されます。 本質的またはインラインのいずれかを選択する際に何を考慮しますか?
一般的に、OSSに何を使用するかについて複数のオプションがありますか? それとも、これも「依存します」ですか?もしそうなら、それは何に依存しますか?
ありがとう!
解決
本当の問題はこれです。
私たち全員が知っており、愛するIntelチップセットは、メモリの書面で明確に定義された順序を持っていません。
Intel®64アーキテクチャメモリホワイトペーパーを注文します. 。このドキュメントは、メモリ書き込みの順序を慎重に定義する試みを提供します。
このドキュメントは、Intel 64およびIA-32アーキテクチャソフトウェア開発者のマニュアルのボリューム3Aに統合されています。
Intel®64およびIA-32アーキテクチャソフトウェア開発者のマニュアルボリューム3A:システムプログラミングガイドパート1 これがその文書の改訂です。
http://www.intel.com/products/processor/manuals/
チップ自体は特定のメモリ書き込み順序を保証しないため、一貫性を保証するのはOSに任されています。
「それは依存する」というのは、「ソフトウェアを構築するOSのAPIに依存する」です。