我已经启动了线程,但它多次调用析构函数,为什么?



我正在用c++学习线程。下面是我所做的一小段代码-

#include<thread>
#include<iostream>
struct tes {
//Constructor
tes() {
  std::cout << "Constructorn";
}
//Destructor
virtual ~tes() {
  std::cout << "Destructorn";
}
void operator()() {
  for(int i = 0 ; i < 15 ; ++i ) std::cout << "Hellon";
}
};
typedef struct tes TES;
// Method
void Input() {
  TES t1;                             //Line #1
  //t1();                             //Line #2
  std::thread thr_1(t1);              //Line #3
  thr_1.join();                       //Line #4
  //thr_1.detach();                   //Line #5 
}
//main()
int main(){
   Input();                        //calling this with parameters
   //...
}

在上面的函数Input()中,如果我只调用#1和#2,一切都运行良好。然而,如果我尝试#1、#3、#4(或#5),输出就会非常混乱。析构函数多次调用自己,我不明白为什么?请帮帮我。谢谢! !

//输出

Constructor
Destructor
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
...
Destructor
Destructor
Destructor
Destructor

这是我运行代码后得到的输出(当然是在修复之后):

<>之前构造函数析构函数你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好析构函数析构函数之前析构函数被调用三次:
  1. INPUT函数中创建的t1对象。[最后一个]

  2. thread的构造函数复制bind期间的可调用项。[第一次打印]

  3. 当线程自身完成调用复制的可调用对象的析构函数时。[倒数第二个]

最新更新