4

これは C++ 標準に関する質問です。私はドラフト標準にしかアクセスできないため、これが公式のものと異なる場合はお詫びします. また、これがどのように機能するかを誤解している場合は、お気軽に修正してください。

1 つは文字列への書き込み、もう 1 つはその文字列の内容のコピーを作成する 2 つのスレッドがあるとします。一般に、ロックには RAII クラスを使用する必要があるstd::mutex myMutex; ことはわかっています。例をより明確にするために、lock と unlock を明示的に使用しました。

// Global variable
std::string message;
std::mutex myMutex;

// Thread one
myMutex.lock();
message = "Hello";
myMutex.unlock();

// Thread two
myMutex.lock();
std::string copy = message;
myMutex.unlock();

私の理解では、これがスレッド間で確実に機能するためには、スレッド 1が文字列を設定した後にリリース操作を実行し、スレッド 2が文字列を読み取る前に取得を実行する必要があります。

C++11 のドラフト標準を読んでも、これを行うと述べているものは何も見えませんがstd::mutex、それが期待されていること、またはミューテックスが何の役にも立たないことは明らかです。

誰かが私に関連セクションを見てもらうことができますか? 標準の文言は、カジュアルな読者にはしばしば明確ではありません:)

4

1 に答える 1

9

30.4.1.2p11 によると、

同期: 同じオブジェクトに対する以前unlock()の操作は、(1.10) [ m.lock()] と同期する必要があります。

1.10p5 では、

[...] たとえば、ミューテックスを取得する呼び出しは、ミューテックスを構成する場所に対して取得操作を実行します。それに応じて、同じミューテックスを解放する呼び出しは、それらの同じ場所で解放操作を実行します。非形式的には、 Aに対して解放操作を実行すると、他のメモリ位置に対する以前の副作用が、後でAに対して消費または取得操作を実行する他のスレッドから見えるようになります。[...]

于 2012-11-13T11:16:03.007 に答える