c++ - 有时打印一行,有时打印三行

标签 c++ multithreading

运行下面给出的多线程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/

相关文章:

C++03 : Add fields to several derived classes

java - 等待所有阻塞队列元素取出后处理

c++ - C/C++ 中的内联函数是一种使它们线程安全的方法吗?

c++ - 如果使用 delete 而不是 free 删除使用 malloc 分配的内存怎么办

c++ - 为什么要在 if 条件下进行解析?

c++ - 如何重载operator<<以与boost::program_options默认值输出一起使用?

c - 我如何在 C 中为 Windows 创建多线程?

c++ - 将 lambda 传递给 std::thread 并调用类方法

c# - 多线程可显着提高内存和CPU的使用率

php - Winsockets - 主体之前和/或之后的奇怪字符