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
对象。