C++ 多线程,高并发,成员函数做线程函数

如果成员函数做线程函数的话,那么会有一个问题
就是
在主线程里,如果使用了thread.detach()方法,那么如何保证传递到作为线程函数的成员函数中的变量在主线程结束销毁之前,成功得到,并与主线程里的变量脱离内存关联?
你会说,直接这样写


void threadTest01(const int &a)
{
	cout<<a<<endl;
}

int main()
{
	int a = 1;
	thread myThread(threadTest01,a);
	myThread.detach();
}

这样写,确实没问题,线程初始函数中的int类型的引用a指的是新的地址,也就是说,虽然使用的是引用,但是实际上是安全的,引用的变量指向的是新的内存地址.
但是虽然使用了引用,实际上使用的是新的内存内的变量,但是,那你为啥不直接这样写?

void threadTest01(int a)
{
	cout<<a<<endl;
}

你说的没毛病,就是该这么写
但是如果是数组,你怎么办呢?

void threadTest01(const char *a)
{
	cout<<a<<endl;
}

int main()
{
	char a = "this is myThread stat func";
	thread myThread(threadTest01,a);
	myThread.detach();
}

这就完全不可预知了,因为指针指的就是主线程中的数组的内存,如果主线程结束销毁了,那么线程中的数组是什么就完全不可预知了,这是很危险的,怎么解决这个问题呢?
可以使用隐式类型转换的方法

void threadTest01(const string &a)
{
	cout<<a<<endl;
}

int main()
{
	char a = "this is myThread stat func";
	thread myThread(threadTest01,a);
	myThread.detach();
}

这样就行了,隐式转换,会给string一个新的内存地址,但是这也不是完全安全的因为如果还没又进行隐式转换,主线程就已经结束了,char数组已经销毁了,这样又是完全不可预知了

那么怎么解决这个问题呢?
创建临时变量是个好方法

void threadTest01(const string &a)
{
	cout<<a<<endl;
}

int main()
{
	char a = "this is myThread stat func";
	//---------------------------在这里创建了一个string的临时变量
	thread myThread(threadTest01,string(a));
	myThread.detach();
}

你会问,这样和上面有什么区别吗?万一临时变量还没创建呢,主线程就已经结束了,那结果不还是一样?
你说的有道理,但是这样写是完全没问题的,下面进行验证
请看下一篇
C++多线程,给初始线程的函数传递参数的隐式转换和临时变量的讨论

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值