threadの同期について


こんにちは、C++の初学者です。  
ビャーネ・ストラウストラップ先生の『プログラミング言語C++
第4版』から以下のexampleを引用しました。fとF()が同じオブジェクトcoutを使っているから、出力結果が予測不能であって、「PaHerallllel
o World!」などのように崩れた出力を得るかもしれないと書かれているのですが、実際のところ、ちゃんと「Hello, Parallel
World!」と出力されます。これは何故なのでしょうか。ご教授願います。

[code]

    #include <iostream> 
    #include <thread> 
    using namespace std; 
    
    void f() { cout << "Hello, "; } 
    
    struct F { 
            void operator()() { cout << "Parallel World!\n"; } 
    }; 
    
    void user() { 
            thread t1 {f}; 
            thread t2 {F()}; 
    
            t1.join(); 
            t2.join(); 
    } 
    
    int main() { 
            user(); 
    }
    
[/code]




Visual Studio 2019 で 実行したところ  
上記の `user();` 関数を １万回実行すると １３回程度

[code]

    Hello, Hello, Parallel World!
    
[/code]

や

[code]

    Parallel World!
    
[/code]

という出力結果が混じりました。

[code]

    出力結果が予測不能であって、「PaHerallllel o World!」などのように崩れた出力を得るかもしれない
    
[/code]

それは cout の内部実装が どのように スレッド間の 同期をとっているかわからないので  
予測不可能だと思います。  
１文字づつ 同期しているなら 例のように混在するかもしれません。

`cout` へのアクセスは スレッドセーフですが  
その出力する文字は混じるかもしれませんと  
[MSDN でも 書かれていました。](https://docs.microsoft.com/ja-jp/cpp/standard-
library/thread-safety-in-the-cpp-standard-library?view=vs-2019)




Visual Studio 2019 で 実行したところ  
上記の `user();` 関数を １万回実行すると １３回程度

[code]

    Hello, Hello, Parallel World!
    
[/code]

や

[code]

    Parallel World!
    
[/code]

という出力結果が混じりました。

[code]

    出力結果が予測不能であって、「PaHerallllel o World!」などのように崩れた出力を得るかもしれない
    
[/code]

それは cout の内部実装が どのように スレッド間の 同期をとっているかわからないので  
予測不可能だと思います。  
１文字づつ 同期しているなら 例のように混在するかもしれません。

`cout` へのアクセスは スレッドセーフですが  
その出力する文字は混じるかもしれませんと  
[MSDN でも 書かれていました。](https://docs.microsoft.com/ja-jp/cpp/standard-
library/thread-safety-in-the-cpp-standard-library?view=vs-2019)

