gpt4 book ai didi

c++ - std::thread 和 std::endl 没有预期的输出

转载 作者:太空宇宙 更新时间:2023-11-03 10:33:15 24 4
gpt4 key购买 nike

我正在尝试来自 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我没有得到预期的输出。

最佳答案

这个:

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

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

如果你想保证一个特定的表达式被原子输出,那么你需要在 std::cout 之上添加你自己的同步原语。

关于c++ - std::thread 和 std::endl 没有预期的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10275805/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com