1

いくつかの例を試してみるとC++11 threads、驚くべき結果が得られます。次のコードで

#include <iostream>
#include <thread>

void hello() {
    std::cout << "Hello concurrent world " << std::endl;
}
void do_something() {
    std::cout << "[background_task] --> [ do_something ]" << std::endl;
}
void do_something_else() {
    std::cout << "[background_task] --> [ do_something_else ]" << std::endl;
}
class background_task {
public:
    void operator()() const     {       
        do_something();
        do_something_else();
    }
};

int main ( int argc, char **argv) {
    std::thread t(hello);
    background_task bt;
    std::thread fn_obj_th(bt);
    t.join();
    fn_obj_th.join();
}

出力は次のとおりです

Hello concurrent world [background_task] --> [ do_something ]

[background_task] --> [ do_something_else ]
Press any key to continue . . .

に置き換える std::cout << "Hello concurrent world " << std::endl;std::cout << "Hello concurrent world \n";

結果は

Hello concurrent world
[background_task] --> [ do_something ]
[background_task] --> [ do_something_else ]

std::endl期待される出力が得られない場合に備えて、なぜですか。

4

1 に答える 1

8

これ:

std::cout << "Hello concurrent world " << std::endl;

2 つの独立した出力です。はスレッドセーフですが、2 つの個別の呼び出しがアトミックであることが保証されているstd::coutわけではありません。単一の出力はアトミックですが、2 つではありません。

特定の式がアトミックに出力されることを保証したい場合は、独自の同期プリミティブを の上に追加する必要がありますstd::cout

于 2012-04-23T06:32:26.943 に答える