C++11之future(二)
如果有两个线程,其中一个线程想要获取另一个线程的返回值,该怎么办?
于是接下来要谈的package_task就是为了解决这个问题而诞生的。
// ConsoleApplication5.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include<random>
#include<iostream>
#include<vector>
#include<thread>
#include<algorithm>
#include<future>
using namespace std;
int mythread_one()
{
cout << "子线程1开始执行了,id:" << this_thread::get_id() << endl;
cout << "子线程1执行任务中...." << endl;
this_thread::sleep_for(chrono::seconds(3));
cout << "子线程1任务结束了" << endl;
return 5;
} void mythread_two(future<int> &ps)
{
cout << "子线程2开始执行了" << endl;
auto x = ps.get();
cout << "获取子线程1的值为:" << x << endl;
cout << "子线程2任务执行结束" << endl;
}
int main()
{
//首先用pack_task包裹线程
packaged_task<int(void)> tp(mythread_one);
//通过包裹的对象获取到future对象
future<int> a = tp.get_future();
//创建线程 thread th_one(ref(tp));
//让线程先执行起来
th_one.join(); thread th_two(mythread_two,ref(a));
th_two.join(); return 0;
}
如果有多个线程,都想要获得该值,用这个函数可以做到吗?
下面看截取的这段代码:
void mythread_two(future<int> &ps)
{
cout << "子线程2开始执行了" << endl;
auto x = ps.get();
cout << "获取子线程1的值为:" << x << endl;
cout << "子线程2任务执行结束" << endl;
}
如果变为如下:
void mythread_two(future<int> &ps)
{
cout << "子线程2开始执行了" << endl;
auto x = ps.get();
auto x = ps.get();
cout << "获取子线程1的值为:" << x << endl;
cout << "子线程2任务执行结束" << endl;
}
多加了一行get()语句,经过程序运行是会抛异常的。
解释:get()函数内部实现是移动的语义,也就是说第一次调用后,里面的值已经被移动走了,如果再次调用get()的话,里面的值就为空了。
那该如何解决多线程同时想要获取一个线程资源的方法呢?于是share_future就出现了,下面把代码进行变换:
// ConsoleApplication5.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include<random>
#include<iostream>
#include<vector>
#include<thread>
#include<algorithm>
#include<future>
using namespace std;
int mythread_one()
{
cout << "子线程1开始执行了,id:" << this_thread::get_id() << endl;
cout << "子线程1执行任务中...." << endl;
this_thread::sleep_for(chrono::seconds(3));
cout << "子线程1任务结束了" << endl;
return 5;
} void mythread_two(shared_future<int> &ps)
{
cout << "子线程2开始执行了" << endl;
auto x = ps.get();
cout << "获取子线程1的值为:" << x << endl;
cout << "子线程2任务执行结束" << endl;
}
void mythread_three(shared_future<int>& ps)
{
cout << "子线程3开始执行了" << endl;
auto x = ps.get();
cout << "获取子线程1的值为:" << x << endl;
cout << "子线程3任务执行结束" << endl;
}
int main()
{
//首先用pack_task包裹线程
packaged_task<int(void)> tp(mythread_one); shared_future<int> a=tp.get_future(); thread th_one(ref(tp));
//让线程先执行起来
th_one.join(); thread th_two(mythread_two,ref(a));
thread th_three(mythread_three, ref(a));
th_two.join();
th_three.join(); return 0;
}
如果用了share_future的话,调用get()就是值拷贝机制了,所以可以多次调用get().
所以即使像下面这样一样ok
void mythread_three(shared_future<int>& ps)
{
cout << "子线程3开始执行了" << endl;
auto x = ps.get();
auto x = ps.get();
auto x = ps.get();
cout << "获取子线程1的值为:" << x << endl;
cout << "子线程3任务执行结束" << endl;
}
C++11之future(二)的更多相关文章
- 【阿里聚安全·安全周刊】阿里双11技术十二讲直播预约|AWS S3配置错误曝光NSA陆军机密文件
关键词:阿里双11技术十二讲直播丨雪人计划丨亚马逊AWS S3配置错误丨2018威胁预测丨MacOS漏洞丨智能风控平台MTEE3丨黑客窃取<权利的游戏>剧本|Android 8.1 本 ...
- C++11多线程のfuture,promise,package_task
一.c++11中可以在调用进程中获取被调进程中的结果,具体用法如下 // threadTest.cpp: 定义控制台应用程序的入口点. // #include "stdafx.h" ...
- Python for Informatics 第11章 正则表达式二(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 11.1 正则表达式的字符匹配 ...
- python学习笔记11(函数二): 参数的传递、变量的作用域
一.函数形参和实参的区别 形参全称是形式参数,在用def关键字定义函数时函数名后面括号里的变量称作为形式参数. 实参全称为实际参数,在调用函数时提供的值或者变量称作为实际参数. >>> ...
- C++ 11 笔记 (二) : for循环
首先肯定的是,我不是标题党.. C++11的for循环确实有跟C++98不一样的地方,还是先上代码: , , , , }; for (int x : test_arr) { std::cout < ...
- C++11 并发指南二(std::thread 详解)
上一篇博客<C++11 并发指南一(C++11 多线程初探)>中只是提到了 std::thread 的基本用法,并给出了一个最简单的例子,本文将稍微详细地介绍 std::thread 的用 ...
- 11.8 开课二个月零四天 (Jquery取属性值,做全选,去空格)
1.jquery取复选框的值 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "htt ...
- 11.8 开课二个月零四天 (Jquery)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- C++11 并发指南二(std::thread 详解)(转)
上一篇博客<C++11 并发指南一(C++11 多线程初探)>中只是提到了 std::thread 的基本用法,并给出了一个最简单的例子,本文将稍微详细地介绍 std::thread 的用 ...
随机推荐
- Linux的课堂便利脚本
上课的时,因为教室机总会重新重启,有时候就要重配网卡yum源和下载一些辅助工具,这里写一个脚本省去冗杂的过程 if [[]]可以防止unary operator expected的报错 nmcli d ...
- cmake以源码的方式引入第三方项目
最前 本文将介绍一种以源码的方式引入第三方库的方法 准备 主项目,需要引用第三方库的某些函数 第三方库,以源码的形式提供给主项目使用 注意: 本文的背景:已经将第三方源码下载好. 一个例子 我这里准备 ...
- 【LeetCode】370. Range Addition 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 只修改区间起终点 日期 题目地址:https://le ...
- leetcode 761. Special Binary String
761. Special Binary String 题意: 一个符合以下两个要求的二进制串: \(1.串中包含的1和0的个数是相等的.\) \(2.二进制串的所有前缀中1的个数不少于0的个数\) 被 ...
- 【LeetCode】789. Escape The Ghosts 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】841. Keys and Rooms 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS BFS 日期 题目地址:https://le ...
- Interval Bound Propagation (IBP)
目录 概 主要内容 IBP CROWN CROWN-IBP 训练的技巧 写在最后 代码 Gowal S., Dvijotham K., Stanforth R., Bunel R., Qin C., ...
- [C++]使用vector描述线性表定义及基本操作
#ifndef VECTORLIST_H #define VECTORLIST_H #include<iostream> #include"linearlist.h" ...
- JUC之线程间定制化通信
线程通信之定制化 之前文章中写了下Condition的使用,这里我们详细说下其中的用法: 首先使用Condition需要实例化Lock private Lock lock = new Reentran ...
- 基于Spring MVC + Spring + MyBatis的【学生信息管理系统】
资源下载:https://download.csdn.net/download/weixin_44893902/45603211 练习点设计: 模糊查询.删除.新增 一.语言和环境 实现语言:JAVA ...