【问题标题】:Giving a std::shared_ptr<std::thread> to itself. Defined or Undefined behavior给自己一个 std::shared_ptr<std::thread> 。已定义或未定义的行为
【发布时间】:2018-05-10 20:11:09
【问题描述】:

我有以下代码:

void launchThread() {
    std::shared_ptr<std::thread> t;
    t = std::make_shared<std::thread>([t] {std::cout<< "HelloWorld"<<std::endl;});
    t->detach();
}

int main(){
    launchThread();
    somthing that takes a while.... 
}

如果我是正确的,thead 应该使用共享指针保持自身活动,直到线程本身超出范围。但是我想知道当共享指针被破坏时会发生什么,线程会被正确清理吗?还是这是不好的做法?

【问题讨论】:

  • t 的赋值发生在它的值被 lambda 对象捕获之后。如果您在线程中查看t.get(),它将为空。
  • [t] { 的意义何在?您想做什么?为什么您认为该代码可能有效?

标签: c++ multithreading c++11 shared-ptr


【解决方案1】:

std::thread::detach 释放所有权 - 当shared_ptr 被销毁时,分离的执行线程不会发生任何事情。

这是不好的做法,因为你可以简单地写...

std::thread{[]{ std::cout<< "HelloWorld" << std::endl; }}.detach();

...生成一个后台线程,它会自行清理。

【讨论】:

  • 显然,OP 提供了一个 mcve,在他们的实际实现中,可能有一些细节证明使用智能指针是合理的。 (无论如何+1)
  • 请注意,分离的线程使程序几乎不可能被证明是正确的,因为在分离后如果没有平台特定的黑客攻击,检测你的线程在主端之前实际上已经完成几乎是不可能的。至少可以说,在 main 结束后运行的线程是不可移植的。
  • @Yakk 或者 main 根本没有返回(你也没有exit)。
猜你喜欢
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-20
  • 2023-02-07
  • 1970-01-01
  • 2015-11-27
相关资源
最近更新 更多