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 的用 ...
随机推荐
- JAVA生成订单编号工具类
JAVA根据时间戳和随机数方式生成订单编号工具类 OrderUtils.java package com.util; import java.text.DateFormat; import java. ...
- JAVA调用微信接口实现页面分享功能(分享到朋友圈显示图片,分享给朋友)
钉钉提供的内网穿透之HTTP穿透:https://www.cnblogs.com/pxblog/p/13862376.html 网页分享到微信中如何显示标题图,如果自定义标题图,描述,显示效果如下 官 ...
- windows10 下使用 spdlog 总结(spdlog 1.7)
!!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!! 作者:mohist 注意: 请选择对c++11 支持 完善的编译器, 为什么vs2013不行,因为: spdlo ...
- 自定义C语言CVector
CVector.h // // cvector.h // GKApp // // Created by 王明辉 on 16/4/15. // Copyright (c) 2016年 GK. All r ...
- 【LeetCode】930. Binary Subarrays With Sum 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 二分查找 字典 相似题目 参考资料 日期 题目地址: ...
- 【LeetCode】657. Judge Route Circle 解题报告
[LeetCode]657. Judge Route Circle 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/judge-route- ...
- 【LeetCode】50. Pow(x, n) 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述: 题目大意 解题方法 递归 迭代 日期 题目地址: https://le ...
- 【LeetCode】17. Letter Combinations of a Phone Number 电话号码的字母组合
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:电话号码, 字母组合,回溯法,题解,leetcode, ...
- 【LeetCode】764. Largest Plus Sign 解题报告(Python)
[LeetCode]764. Largest Plus Sign 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn ...
- 一个简单的js时钟
演示地址 代码 <html> <head> <title> Nonove js clock 时钟 </title> <script type=&q ...