c++多线程thread操作(二)线程管理

c++多线程系列

c++多线程thread操作(一)环境部署

c++多线程thread操作(二)线程管理

c++多线程thread操作(三)数据竞争互斥访问

c++多线程thread操作(四)死锁的问题和解决

c++多线程thread操作(五)unique_lock加锁

c++多线程thread操作(六)条件变量的使用

c++多线程thread操作(七)父进程获取子进程变量的结果

c++多线程thread操作(八)父线程传递数据给子线程

c++多线程thread操作(九)可调用方式

(终)c++多线程thread操作(十)多线程并行实现数据相加的和

1. 先看最简单的线程实现案例:

void func_1() {
	cout << "hello linger" << endl;
}

int main() {
	thread t1(func_1); // t1 与主线程互不影响 
	for (int i = 0; i < 10; i++) { // 万一它出现异常就没法join了 
		cout << "from main:" << i << endl;
	}
	t1.join();
	return 0;
}

存在的问题:如果 for循环这一段代码出现异常了,t1将没法join,那么子线程随主线程终止。

解决方法是在异常处理中调用join()。

2. 异常改进写法:

void func_1() {
	cout << "hello linger" << endl;
}

int main() {
	thread t1(func_1); // t1 与主线程互不影响 
	try {
		for (int i = 0; i < 10; i++) { // 万一它出现异常就没法join了 
			cout << "from main:" << i << endl;
		}
	}
	catch (...) { // 加入异常捕获
		t1.join();
		throw;
	}
	t1.join();
	return 0;
}

3. 类仿函数的使用并传递值参数

class Fctor {
public:
	void operator()(string s) { // 值传递 
		for (int i = 0; i>-10; i--) {
			cout << " from t1:" << s << endl;
		}
	}
};
// thread t1((Fctor()),ss);将其改为以下部分
string ss = "meimei";
thread t1((Fctor()),ss);//与上述等价 

此时,传递参数是值传递,涉及到拷贝操作,耗费资源,下面考虑改进为引用传递

4. 类仿函数的使用并传递引用参数

class Fctor {
public:
	void operator()(string&s) { // 值传递 
		for (int i = 0; i>-10; i--) {
			cout << " from t1:" << s << endl;
		}
        s = "flying";
	}
};

string ss = "meimei";
thread t1((Fctor()),ref(ss));
// thread t1((Fctor()),move(ss)); 主线程的字符串移动到子线程,主线程ss已经失效

其中ref(string)代表将string的引用传入形参,主线程中仍然有ss变量;move代表将主线程的ss变量移动到子线程中,此时ss变量已经不在主线程中,子线程改变的结果无法返回主线程!!如果还需要在主线程中输出ss变量,则不要使用move,而是使用ref命令!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值