运行下面给出的多线程C++代码有时会按预期在标准输出上打印一次“XYZ”,但有时输出会在标准输出上包含三行“XYZ”。当我是多线程概念的新手时,有人会详细说明为什么会这样吗?
#include<iostream>
#include<thread>
void f(std::string s)
{
std::cout << s << std::endl;
}
void not_oops()
{
f( "XYZ");
std::string buffer="XYZ";
std::thread t(f,buffer);
t.detach();
}
int main()
{
not_oops();
}
平台:-Ubuntu 18.04
编译器:-g++ 7.4.0
编译代码时命令:-g++ -pthread main.cpp
最佳答案
detach
的使用可能引起您的观察,并且在遇到种族时可以得到解释。
当您仅观察一行输出时,这是因为新线程的产生正在与退出的进程竞争。如果未及时生成,则仅显示由主线程生成的输出。
当您观察到三行输出时,这是因为cout
被多个线程刷新了。由于cout
并非线程安全的,因此主线程可能在打印派生线程的同时正在执行全局析构函数。两者都认为内部流缓冲区有一些要刷新的内容,因此内容将显示两次。
当您改用join
时,主线程在结束程序之前等待生成的线程完成,从而消除了竞争条件。因此,按照预期,您仅观察到两行输出。
关于c++ - 有时打印一行,有时打印三行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59916363/