c++多线程系列
c++多线程thread操作(五)unique_lock加锁
c++多线程thread操作(七)父进程获取子进程变量的结果
(终)c++多线程thread操作(十)多线程并行实现数据相加的和
实现父线程和子线程的交互
1. 实现方式:
主线程定义promise,然后在主线程中设定promise的数据,子线程可以直接从主线程的promise中获取数据;
int factorial(future<int>&f) {//将结果返回给x
int res = 1;
int N = f.get();//主线程不set_value,会发生异常
for (int i = N; i > 1; i--) {
res *= i;
}
cout << "res = " << res << endl;
return res;
}
int main() {
int x;
promise<int>p;
future<int>f = p.get_future();//从未来获取future变量
future<int>fu = async(launch::async,factorial, std::ref(f));
p.set_value(4);// 父线程给子线程设置变量
x = fu.get();
cout << x << endl;
return 0;
}
注意:
1. promise和future 只能move,不能copy;
2. 主线程不set_value,会发生异常
问题:
如果要创建的future和promise太多,则书写代码不便利,从而用shared_future解决;
2. shared_future实现
int factorial(shared_future<int>sf){
int res = 1;
int N = f.get();//主线程不set_value,会发生异常
for (int i = N; i > 1; i--) {
res *= i;
}
cout << "res = " << res << endl;
return res;
}
int main() {
int x;
promise<int>p;
future<int>f = p.get_future();
shared_future<int>sf = f.share();
future<int>fu = async(launch::async, factorial, sf);
p.set_value(4);//set_value,所有的子线程值都是4
return 0;
}
shared_future可以被拷贝,以拷贝形式实现;
3.完整代码
#include <iostream>
#include <thread>
#include <future>
using namespace std;
int factorial(shared_future<int>sf)
int res = 1;
int N = f.get();
for (int i = N; i > 1; i--) {
res *= i;
}
//cout << "res = " << res << endl;
return res;
}
int main() {
int x;
promise<int>p;
future<int>f = p.get_future();
shared_future<int>sf = f.share();
future<int>fu = async(launch::async, factorial, sf);
p.set_value(4);
x = fu.get();
cout<<x<<endl;
return 0;
}