c++多线程系列
c++多线程thread操作(五)unique_lock加锁
c++多线程thread操作(七)父进程获取子进程变量的结果
(终)c++多线程thread操作(十)多线程并行实现数据相加的和
问题:如果我们在主线程中需要将一个计算资源大的操作丢给子线程做,那我们应该如何从子线程中获取结果呢?
可尝试的方案1:
在主线程中定义一个引用变量在子线程中,然后将引用变量的结果在主线程中输出;
void sum_res(int N, int &x) {//将结果返回给x
int res = 0;
for (int i = N; i >= 1; i--) {
res += i;
}
x = res;
}
int main() {
int x;
thread t1(sum_res, 4, ref(x));
t1.join();
cout<<x<<endl;
return 0;
}
问题:
1. 主线程中的x和子线程的x是共享资源,需要互斥访问;
2. 如果主线程和子线程对x的操作复杂,并且得到x之后还需要再做其它计算,则需要将用到条件变量,主线程和子线程相互提醒;
可是我们就只想得到子线程的x结果,需要这么复杂吗?当然有更好的实现方式!
解决方案:
使用Future变量,Future可以从子线程中获取返回的结果;
可尝试的方案2:
int sum_res(int N) {//将结果返回给x
int res = 1;
for (int i = N; i >= 1; i--) {
res += i;
}
return res;
}
int main() {
int x;
future<int>fu = async(factorial,4);
x = fu.get();//等待子线程结束,并得到子线程中返回的结果
cout<<x<<endl;
return 0;
}
使用异步访问的方式,fu.get()方法可以获得结果;
需要注意:
1. fu.get()函数只能调用一次,否则会报错
2. asycn 并不一定会创建子线程,取决于第一个参数
launch::deferred, asycn不会创建子线程 会延期启动factorial函数,直到get函数被调用,factorial函数将在同一个线程中被调用
launch::asycn 会创建另一个线程来执行factorial
future<int>fu = async(launch::deferred,factorial, 4);
完整代码:
#include <iostream>
#include <thread>
#include <future>
using namespace std;
condition_variable cond;
int sum_res(int N) {//将结果返回给x
int res = 1;
for (int i = N; i >= 1; i--) {
res += i;
}
return res;
}
int main() {
int x;
future<int>fu = async(launch::asycn | launch::deferred,factorial, 4);
x = fu.get();// fu.get()函数只能调用一次,否则会报错
cout<<x<<endl;
return 0;
}