3

DCLP の問題を説明している記事「C++ とダブルチェック ロックの危険性」を読んでいます。

記事の第 2 部 (リンク先) では、C/C++ volatile だけで DCLP を試して解決する方法を示します (私の知る限り、これは不可能です)。記事では、ライターはその方法を説明していますが (最後の例は 11 番です)、次のように書いています。

残念ながら、これだけでは最初の問題に対処することはできません。C++ の抽象マシンはシングル スレッドであり、C++ コンパイラは、前述のようなソースからスレッドセーフでないコードを生成することを選択する可能性があります。そうしないと、最適化の機会が失われ、効率が大幅に低下します。このすべての後、振り出しに戻ります。しかし、待ってください。さらに多くのプロセッサがあります。

つまり、(私が正しく理解していれば) volatile をどれだけうまく使用しても機能しないということです」ちょうど言及した

しかし、それは「C++ の抽象マシンはシングル スレッドである」とはどういう意味ですか?!

これらすべての揮発性物質を使用した上記の例では、並べ替えが妨げられないのはなぜですか?

ありがとう!

4

2 に答える 2

2

C++11 以降、太字でマークされた文はもはや真実ではありません。

過去の意味:
OS/デバイスは、それらを開始する関数などを含む複数のスレッドをサポートしている場合があります。
一方、C++ コンパイラなどは、シングル スレッド環境を「考え」ており、複数のスレッドを使用する場合に発生する可能性のある問題を認識していません。スレッド。スレッドの開始は、スレッドの通常の関数呼び出しに他なりません。また、その呼び出しのために OS がプロセスに対して奇妙なことを行うことは、知られていないし、興味深いものでもありません。

シングル スレッド環境でのコードの並べ替えは、並べ替えられたコード部分が互いに独立している限り可能です (たとえば、変数の書き込み/読み取りの順序によって、この変数を使用するコードが依存するようになります)。マルチスレッド環境では、コンパイラは、変数が別のスレッドの影響を受けるかどうか、いつ影響を受けるかを知ることができません...

現在、C++11/C++14 では、
スレッド化されたコードを壊す最適化を防止するための OS に依存しないサポートがあります。

于 2015-06-13T10:46:14.693 に答える
0

これは、1 つのスレッドによって実行された書き込みが常にそれ自体にすぐに表示され、コードがコンパイラまたは CPU によって並べ替えられなかった場合と同じ論理結果になることを意味します。

壊れていたのは、これらの書き込みが同じデータ空間を共有する他のスレッドにどのように表示されるかでした。これは C++11 で修正されました。

また、const と mutable に少し異なる意味を与えました。クラス メンバーを変更可能にすることは、以前のように面倒なことではなくなりました。メンバーをスレッド セーフな方法で変更できる場合に使用します。つまり、すべての変更は、論理的に一貫した方法で他のスレッドに表示されます。たとえば、std::mutex または std::atomic を可変にすることはまったく問題ありませんが、プレーンな int はできません。

于 2015-06-13T11:13:47.567 に答える