c++多线程系列
c++多线程thread操作(五)unique_lock加锁
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命令!