如果其参数被删除,std :: thread在另一个线程中会崩溃吗?

时间:2017-06-02 05:03:05

标签: c++ stdthread

我读了很多&我仍然不确定我是否理解(我是木工)。

假设我有一个功能:

void class_test::example_1(int a, int b, char c)
{
//do stuff
int v;
int k;
char z;
if(condition)
    {
     std::thread thread_in_example (&class_test::example_1, & object, v ,k ,z);
     th.detach();
    }
}

现在如果我打电话:

std::thread example (&class_test::example_1, &object, a, b, c);
example.detach();

问题:当 示例 完成时, thread_in_example 会发生什么? " detele"本人呢? thread_in_example 是否会失去对其参数的访问权限?

我认为std :: thread正在制作元素的副本,除非它们是由& reference给出但在http://en.cppreference.com/w/cpp/thread/thread上我不能理解这一部分(因为我缺乏知识)编程/英语/计算机科学的语义学:

  

std :: thread对象也可能处于不表示任何线程的状态(默认构造,移动,分离或连接之后),并且执行线程可能与任何线程对象无关(在分离之后) )。

也是这个:

  

没有两个std :: thread对象可能代表相同的执行线程;   std :: thread不是CopyConstructible或CopyAssignable,尽管它是   MoveConstructible和MoveAssignable。

所以我怀疑它是如何运作的。

1 个答案:

答案 0 :(得分:2)

来自this std::thread::detach reference

  

将执行线程与线程对象分开,允许执行独立继续。 线程退出后,将释放所有已分配的资源。

[强调我的]

在这些“已分配的资源”中将是参数,这意味着您仍然可以安全地使用分离线程中的参数。

除非您当然是参数或指向独立于分离线程或创建分离线程的线程而被破坏的对象的引用。