我正在尝试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
的情况下我没有得到预期的输出。
答案 0 :(得分:8)
此:
std::cout << "Hello concurrent world " << std::endl;
是两个单独的输出。虽然std::cout
是线程安全的,但这并不意味着保证对它进行两次单独的调用是原子的。单个输出是原子的,但不是两个。
如果您希望保证特定表达式是原子输出,那么您需要在std::cout
之上添加自己的同步原语。