Multithreading 当线程对象的控制智能指针超出作用域时,它会被销毁吗

Multithreading 当线程对象的控制智能指针超出作用域时,它会被销毁吗,multithreading,smart-pointers,Multithreading,Smart Pointers,当线程对象的控制智能指针超出范围时,线程对象是否会被销毁 例如,在下面的代码中,当执行process()函数时,线程是否仍在运行?我的理解是,所有50个线程都将被销毁,因为在执行process()函数时,它们的智能指针t将超出范围。我说得对吗 int main(){ for (int i=0; i<50; i++){ std::shared_ptr<MyRunner> sub(new MyRunner()); std::unique_ptr<Th

当线程对象的控制智能指针超出范围时,线程对象是否会被销毁

例如,在下面的代码中,当执行process()函数时,线程是否仍在运行?我的理解是,所有50个线程都将被销毁,因为在执行process()函数时,它们的智能指针t将超出范围。我说得对吗

int main(){
  for (int i=0; i<50; i++){
    std::shared_ptr<MyRunner> sub(new MyRunner());   
    std::unique_ptr<Thread> t(new Thread(sub)); 
    t->start();
  }
  process();
}
intmain(){
对于(int i=0;istart();
}
过程();
}

我想你说得对。这并不是“线程”所特有的同样,但更多的是
unique\u ptr
的行为,当指针超出范围时,它会破坏自己的指针。在您的示例中,您可以用
Banana
替换
Thread
,用
Apple
替换
MyRunner
,从这个意义上讲,行为是相同的


谢谢。那么,如果我想在一个循环中启动50个线程,并且仍然使用智能指针来控制线程对象,我如何修改上述代码?(有没有一种方法可以让线程继续运行,即使它们的控制智能指针超出范围)

就线程而言,无论智能指针是否已死亡,它们都将继续运行。更好的问题可能是,在线程完成运行之前,如何保持智能指针处于活动状态。要做到这一点,您需要知道两件事,第一件事是,如何知道线程何时完成pr第二,如何保持对多个智能指针的引用

回答第一部分将取决于底层线程实现的细节,所以我不能说得太详细

对于第二种情况,像std::vector这样的数组可能会很有用。您可能希望参考以下问题,了解这种方法可能存在的缺陷:


谢谢。那么,如果我想在一个循环中启动50个线程,并且仍然使用智能指针控制线程对象,我如何修改上述代码?(有没有办法让线程在其控制智能指针超出范围的情况下继续运行)?我在回答中添加了一些更详细的内容