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;

是两个独立的输出。虽然std::cout是线程安全的,但这并不意味着它的两次单独调用保证是原子的。单个输出是原子的,但不是两个。

如果您希望保证以原子方式输出特定表达式,则需要在std::cout.

于 2012-04-23T06:32:26.943 回答