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

时间:2014-03-26 04:13:12

标签: 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<Thread> t(new Thread(sub)); 
    t->start();
  }
  process();
}

1 个答案:

答案 0 :(得分:1)

我认为你说得对。这并不是特定于&#34;线程&#34;因此,更多的是unique_ptr在超出范围时销毁其拥有的指针的行为。在您的示例中,您可以将Thread替换为Banana,将MyRunner替换为Apple,并且该意义上的行为将是相同的。

  

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

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

回答第一部分将取决于底层线程实现的细节,因此我无法详细说明。

对于第二个,可能像std :: vector这样的数组会很有用。您可能希望参考这些问题,以获取有关此方法可能存在缺陷的信息:

So can unique_ptr be used safely in stl collections? Why can I not push_back a unique_ptr into a vector?