この関数を実行すると:
void f() {
std::cout << "Hello, " << "world!\n";
}
複数のスレッドから、2 つの文字列の多かれ少なかれランダムなインターリーブが得られ"Hello, "
ます"world\n"
。これは、次のようにコードを記述した場合と同様に、2 つの関数呼び出しがあるためです。
void f() {
std::cout << "Hello, ";
std::cout << "world!\n";
}
そのインターリーブを防ぐには、ロックを追加する必要があります。
std::mutex mtx;
void f() {
std::lock_guard<std::mutex> lock(mtx);
std::cout << "Hello, " << "world!\n";
}
つまり、インターリーブの問題は とは何の関係もcout
ありません。それを使用するコードについてです。テキストを挿入する2つの別個の関数呼び出しがあるため、複数のスレッドが同じコードを同時に実行するのを防止しない限り、関数呼び出し間でスレッドが切り替わる可能性があります。インターリーブ。
ミューテックスはスレッドの切り替えを妨げないことに注意してください。前のコード スニペットでは、2 つのスレッドから同時にの内容を実行することを防ぎます。f()
スレッドの 1 つは、他のスレッドが終了するまで待機する必要があります。
に書き込んでいる場合もcerr
同じ問題があり、2 つのスレッドが同時にこれらの挿入関数呼び出しを行うことがないようにしない限り、インターリーブされた出力が得られます。つまり、両方の関数が同じものを使用する必要があります。ミューテックス:
std::mutex mtx;
void f() {
std::lock_guard<std::mutex> lock(mtx);
std::cout << "Hello, " << "world!\n";
}
void g() {
std::lock_guard<std::mutex> lock(mtx);
std::cerr << "Hello, " << "world!\n";
}