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;
}

本文详细介绍了C++中使用Future和Promise进行线程间数据传递的方法,包括主线程如何通过Promise设定数据,子线程如何利用Future获取这些数据,以及使用Shared_future优化多子线程场景。
父线程传递数据给子线程&spm=1001.2101.3001.5002&articleId=106996751&d=1&t=3&u=f16a1d68186041b886a04a5bc2c8b708)
2010

被折叠的 条评论
为什么被折叠?



