c++ 学习之 多线程(四)再谈 join 与 detach

本文深入探讨C++多线程中join与detach的使用,指出实参传递问题和值传递问题可能导致的隐患。通过实例解析如何避免主线程资源释放影响子线程,以及如何正确传递引用,确保线程安全和效率。
摘要由CSDN通过智能技术生成

c++ 学习之 多线程(四)再谈 join 与 detach

前言

在之前的学习中,我们初步了解了join与detach的作用,但是当实际应用的时候,有很多地方需要注意,不然总会发生一些意想不到的事情发生,下面我们来说一说join与detach的坑。

正文

1.实参传递问题
问题场景:
当我们用主线程中的局部变量当作实参去初始化thread对象后,调用detach将子线程与主线程分离开,并且主线程在子线程之前结束。
后果:
主线程结束后,主线程内的局部变量将会被释放,但是子线程中仍在使用相应内存空间的内容,这就会出现问题。
解决办法:
用值传递来初始化thread对象,这样相应的变量会被拷贝一份传进子线程中,其拷贝出来的变量的作用域为子线程,主线程结束后,资源释放不会对其造成影响。
若必须传递实参时,应确保子线程在主线程之前结束,或使用join(),让主线程等待子线程结束。

问题场景:
当我们向线程中传递引用时,往往起不到引用的效果,这时候我们需要注意我们传递的是否真的是这个变量的引用呢?

#include<stdio.h>
#include<thread>
using namespace std;
void fun(const int &a)
{
   
	  printf("子线程中a的地址 :%p\n", &a);
}
int main()
{
   
	 int a = 0;
	 printf("主线程中a的地址 :%p\n", &a);
	 thread t(fun,a);
	 t.join();
}

输出结果:
主线程中a的地址 :00F3FAB8
子线程中a的地址 :0113EFC8

可以看到这样传递的引用并不是真正的引用,还是一个值传递。
解决办法:

#include<stdio.h>
#include<thread>
using namespace std;
void fun(const int &a)
{
   
	  printf("子线程中a的地址 :%p\n", &a);
}
int main()
{
   
	  int a = 0;
	  printf("主线程中a的地址 :%p\n", 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值