10

C++11 のミューテックス ロックはvoid lock() volatile. コンパイラはどの関数がメモリ バリアであり、どの関数がそうでないかをどのように判断しますか? 揮発性でなくても、すべての関数はバリアですか? あまり知られていない記憶障害と、誰もが知っておくべき記憶障害とは?

4

2 に答える 2

5

ランタイム ライブラリは、コンパイラが認識できるようにミューテックスを実装する必要があります。言語標準は、これを行う方法について何も述べていません。

おそらく、メモリ バリアとして機能する何らかのオペレーティング システム サービスの呼び出しが関係しています。または、コンパイラはvoid _ReadWriteBarrier();のような拡張機能を持つことができます。

于 2012-07-29T13:58:00.740 に答える
5

あなたの意志の実際の実装はstd::mutex、コンパイラが不正な並べ替えを実行せず、変数のロードを省略せず、ロック変数がアトミックにアクセスされ、CPU がロックの取得と解放に必要なメモリ バリアを実行することを保証します。 .

これを確実にするために実行する必要がある作業の詳細はプラットフォームによって異なりますが、ライブラリの実装は正しいことを行います。

于 2012-07-29T14:19:50.033 に答える