Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果删除另一个线程中的std::thread的参数,它是否会崩溃?_C++_Stdthread - Fatal编程技术网

C++ 如果删除另一个线程中的std::thread的参数,它是否会崩溃?

C++ 如果删除另一个线程中的std::thread的参数,它是否会崩溃?,c++,stdthread,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();

我读了很多书&我仍然不确定我是否理解它(我是一名木工)

假设我有一个函数:

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();
问题:当示例完成并“删除”自己时,示例中的线程会发生什么情况?示例中的线程\u是否将失去对其参数的访问权限

我原以为std::thread是在复制元素,除非它们由&reference提供,但在这一部分我无法真正理解(因为我缺乏编程/英语/计算机科学语义方面的知识):

线程对象也可能处于不表示任何线程的状态(在默认构造、从、分离或连接之后),并且执行的线程可能与任何线程对象不关联(在分离之后)

还有这个:

两个std::thread对象不能代表同一个执行线程; 线程是不可复制构造或可复制分配的,尽管它是可复制的 可移动的可构造的和可移动的可分配的

所以我怀疑它到底是如何工作的。

来自:

将执行线程与thread对象分离,允许独立地继续执行一旦线程退出,所有分配的资源都将被释放。

[我的重点]

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

当然,除非参数是指向对象的引用或指针,这些对象独立于已分离线程或创建已分离线程的线程而销毁。

来自:

将执行线程与thread对象分离,允许独立地继续执行一旦线程退出,所有分配的资源都将被释放。

[我的重点]

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


当然,除非您的参数是指向对象的引用或指针,这些对象是独立于分离线程或创建分离线程的线程而销毁的。

实际上,要获得对线程的引用,需要使用
std::reference\u wrapper
,非常快速,谢谢。所以,只要我保持它的对象“活动”,示例中的线程就完全可以了。我可以问一下我问题中的第二句话是什么意思吗?我一点也不明白....@A.alb在示例中的
线程可能会超出范围并被破坏一旦您分离线程,参数将被复制并由线程内部保存。至于第二个引号,它只是意味着不能复制
std::thread
对象。实际上,要获得对线程的引用,需要
std::reference\u wrapper
,这很快,谢谢。所以,只要我保持它的对象“活动”,示例中的线程就完全可以了。我可以问一下我问题中的第二句话是什么意思吗?我一点也不明白....@A.alb在示例
中的
线程可能会超出范围并被破坏一旦您分离线程,参数将被复制并由线程内部保存。至于第二个引号,它只是表示不能复制
std::thread
对象。