C++多线程基础学习笔记(七)
一、std::async和std::future的用法
std::async是一个函数模板,std::future是一个类模板
#include <iostream>
#include <thread>
#include <future>
#include <Windows.h> using namespace std; int mythread()
{
cout << "my thread:" << std::this_thread::get_id() << " start" << endl;
int temp = ;
temp++;
Sleep();
cout << "my thread:" << std::this_thread::get_id() << " end" << endl;
return temp;
}
int main()
{
cout << "main thread:" << std::this_thread::get_id() << " start" << endl;
std::future<int> result = std::async(std::launch::async, mythread);
//std::async(mythread);相当于std::async(std::launch::async|std::lauch::deferred, mythread);
//自动创建一个线程开始执行线程入口函数,并返回一个std::future对象给result cout << result.get() << endl; //等待入口函数执行,直到拿到返回值,即temp
//result.wait(); //只等待入口函数执行完,但不返回结果
cout << "main thread:" << std::this_thread::get_id() << " end" << endl;
system("pause");
return ;
}

std::async(std::launch::async, mythread);如果std::async()的第一个参数改成std::lauch::deferred,那么线程不会被马上执行,而是延迟到std::future的wait()或者get()函数调用时才执行线程的入口函数。实际上,并没有创建
子线程,而只是在主函数中调用了入口函数。
二、std::packaged_task的用法
std::packaged_task是一个类模板,模板参数各种可调用对象,通过它把各种可调用对象包装起来,方便作为线程入口函数来调用
#include <iostream>
#include <thread>
#include <future>
#include <Windows.h> using namespace std; int fun(int val)
{
cout << "my thread:" << std::this_thread::get_id() << " start" << endl;
val++;
cout << "my thread:" << std::this_thread::get_id() << " end" << endl;
return val;
}
int main()
{
cout << "main thread:" << std::this_thread::get_id() << " start" << endl;
std::packaged_task<int(int)> pack(fun);
thread t1(std::ref(pack), );
t1.join();
std::future<int> result = pack.get_future();
cout << result.get() << endl;
cout << "main thread:" << std::this_thread::get_id() << " end" << endl;
system("pause");
return ;
}
三、std::promise的用法
std::promise是一个类模板,能够在某个线程中给它赋值,然后可以在其他线程中,在将来的某个时刻,可以把这个值取出来。
#include <iostream>
#include <thread>
#include <future>
#include <Windows.h> using namespace std; void mythread1(std::promise<int> &pro, int val)
{
cout << "my thread1:" << std::this_thread::get_id() << " start" << endl;
val++;
val--;
Sleep(); //假设运算了500毫秒
int result = val;
pro.set_value(val);//保存结果
cout << "my thread1:" << std::this_thread::get_id() << " end" << endl;
} void mythread2(std::future<int> &getful)
{
cout << "my thread2:" << std::this_thread::get_id() << " start" << endl;
auto getval = getful.get();
cout << getval << endl;
cout << "my thread2:" << std::this_thread::get_id() << " end" << endl;
}
int main()
{
cout << "main thread:" << std::this_thread::get_id() << " start" << endl;
std::promise<int> prom; //声明一个promise对象,保存类型为int
thread t1(mythread1, std::ref(prom), );
t1.join(); std::future<int> ful = prom.get_future(); //promise和future绑定,用于返回保存的结果 //在主线程获取结果
//auto result = ful.get(); //get()只能使用一次,如果主线程中使用了,t2就不能使用了
//cout << result << endl; //在线程t2中获取结果
thread t2(mythread2, std::ref(ful));
t2.join(); cout << "main thread:" << std::this_thread::get_id() << " end" << endl;
system("pause");
return ;
}
std::ref 用于包装按引用传递的值。
C++多线程基础学习笔记(七)的更多相关文章
- Java基础学习笔记七 Java基础语法之继承和抽象类
继承 继承的概念 在现实生活中,继承一般指的是子女继承父辈的财产.在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系. 例如公司中的研发部员工和维护部员工都属于员工, ...
- C++多线程基础学习笔记(四)
一.创建多个子线程 前面三章讲的例子都是只有一个子线程和主线程,然而实际中有多个子线程.那么下面介绍如何创建多个子线程. #include <iostream> #include < ...
- C++多线程基础学习笔记(一)
下面分三个方面多线程技术的必须掌握一些基本知识. 1.进程 2.线程 3.并发 (1)进程 一个可执行程序运行起来了,即为创建了一个进程.如在电脑上打开了word,就创建了一个word进程,打开QQ, ...
- loadrunner基础学习笔记七-面向目标场景
部署应用程序之前,要执行验收测试以确保系统能够承担预期的实际工作量. 可以为想要生成的每秒点击次数,每秒事务数或事务响应时间设置目标 loadrunner将使用面向目标的场景自动生成所需的目标,当应用 ...
- JDBC一(web基础学习笔记七)
一.JDBC Java数据库的连接技术(Java DataBase Connectivity),能实现Java程序以各种数据库的访问 由一组使用Java语言编写的类和接口(JDBC API)组成,它j ...
- C++多线程基础学习笔记(十)
一.Windows临界区的基本用法 CRITICAL_SECTION my_winsc; //定义一个Windows的临界区,相当于一个mutex变量 InitializeC ...
- C++多线程基础学习笔记(九)
一.std::atomic续谈 上一章说到std::atomic是针对一个变量的,这里补充一下针对的变量操作一般是++,+=,--,&=等等运算 .以下这种不可取:a=a+1; 二.std:: ...
- C++多线程基础学习笔记(八)
shared_futrue和futrue_status的用法 shared_futrue是一个类模板,类似于futrue,不同的是它的成员函数get()可以使用多次,因为是复制数据,而futrue的g ...
- C++多线程基础学习笔记(六)
condition_variable.wait.notifiy_one.notify_all的使用方式 condition_variable:条件变量 wait:等待被唤醒 notify_one:随机 ...
随机推荐
- Luogu P4139 上帝与集合的正确用法
题目链接:Click here Solution: 这道题就考你会不会扩展欧拉定理,根据扩展欧拉定理可知 \[ a^b \equiv a^{(b\,mod\,\varphi(p))+\varphi(p ...
- python IO密集型为什么使用多线程
IO密集型为什么使用多线程 python多线程,可以粗浅理解只用了cpu的一个核心. 为什么IO密集型用多线程?假设我们有多个线程都在发网络请求(request, 等response),一个请求的从发 ...
- 一、MySQL一些简述
概述 数据库(database) : 保存有组织的数据的容器(通常是一个文件或一组文件). 主键(primary key): 唯一标识表中每行的这个列(或这组列)称为主键.主键用表示一个特定的行.没有 ...
- 「CTSC 2008」祭祀
题目链接 戳我 \(Solution\) 第一问 这道题要知道一个叫做\(Dilworth\)的定理 最长反链\(=\)最小链覆盖 证明(\(from\ r\_64\)): 所以我们只要求一个最小链覆 ...
- Java内存缓存-通过Google Guava创建缓存
谷歌Guava缓存 Guava介绍 Guava是Google guava中的一个内存缓存模块,用于将数据缓存到JVM内存中.实际项目开发中经常将一些公共或者常用的数据缓存起来方便快速访问. Guava ...
- Canvas学习:封装Canvas绘制基本图形API
Canvas学习:封装Canvas绘制基本图形API Canvas Canvas学习 从前面的文章中我们了解到,通过Canvas中的CanvasRenderingContext2D对象中的属性和方 ...
- JS中在当前日期上追加一天或者获取上一个月和下一个月
/** * 获取上一个月 * * @date 格式为yyyy-mm-dd的日期,如:2014-01-25 */ function getPreMonth(date) { var arr = date. ...
- APT软件包管理-在线安装
APT (Advanced Packaging Tool高级软件包工具) 是一个强大的包管理系统,而那些图形化程序如 添加/删除 应用程序 都是建立 在它的基础之上的.有了dpkg后,Debian再次 ...
- 学习前端第一天心得体会(初步了解HTML5的新特性以及和HTML的区别)
一.HTML5是什么? HTML5 是最新的 HTML 标准. HTML5 是专门为承载丰富的 web 内容而设计的,并且无需额外插件. HTML5 拥有新的语义.图形以及多媒体元素. HTML5 提 ...
- Ironic 裸金属管理服务
目录 文章目录 目录 Ironic 软件架构设计 资源模型设计 全生命周期的状态机设计 Inspection 裸金属上架自检阶段 Provision 裸金属部署阶段 Clean 裸金属回收阶段 快速体 ...