1. std::promise 可以用来在线程间提供数据传递。

std::future = std::promise.get_future()。

线程中可以对promise赋值std::promise.set_value。

赋值之后std::future.get()就会返回其他线程中设置的值。

#include <iostream>
#include <future>
#include <chrono> std::promise<int> promis;
int main(int argc, const char * argv[]) {
std::future<int> fuResult = promis.get_future();
std::thread t([](){
std::this_thread::sleep_for(std::chrono::seconds());
promis.set_value();
});
t.detach();
std::cout<<"detach..."<<std::endl;
std::cout<<fuResult.get()<<std::endl;
return ;
}
#include "stdafx.h"
#include <iostream>
#include <future>
#include <chrono>
#include <string> std::promise<std::string> promis;
int main()
{
std::future<std::string> fuResult = promis.get_future(); auto t_cb=[]()
{
std::cout << "subThread start!"<<std::endl;
std::chrono::milliseconds dur();
std::this_thread::sleep_for(dur);
promis.set_value("value from subThread");
}; std::thread t(t_cb);
t.detach();
std::cout << "detach..." << std::endl;
std::cout << fuResult.get() << std::endl; getchar();
return ;
}

2. std::packaged_task  可以包裹一个函数, 有点类似std::function,不同之处在于这个可以通过get_future返回std::future对象来获取异步执行的函数结果。

#include "stdafx.h"
#include <iostream>
#include <future>
#include <chrono>
#include <string> int main()
{
std::packaged_task<int()> task([]()
{
std::cout << "packaged_task start!"<<std::endl;
std::chrono::milliseconds dur();
std::this_thread::sleep_for(dur);
return ;
});
std::future<int> fuResult = task.get_future();
std::thread t_task(std::move(task));
t_task.detach();
std::cout << "detach..." << std::endl;
std::cout << fuResult.get() << std::endl;
getchar();
return ;
}

3. std::async提供异步执行的方法,std::future = std::async(...), 函数执行完成后可以通过std::future.get()获取到执行函数的返回值。

#include <iostream>
#include <future>
#include <chrono> int main(int argc, const char * argv[])
{
std::future<int> fuResult = std::async([]()
{
std::this_thread::sleep_for(std::chrono::seconds());
return ;
});
std::cout<<"detach..."<<std::endl;
std::cout<<fuResult.get()<<std::endl;
return ;
}

多线程一----多线程的应用

多线程二----简单线程管理

多线程三----数据竞争和互斥对象

多线程四----死锁和防止死锁

多线程五----unick_lock和once_flag

多线程六----条件变量

多线程七----线程间通信

c++11の异步方法 及线程间通信的更多相关文章

  1. Java多线程编程核心技术---线程间通信(一)

    线程是操作系统中独立的个体,但这些个体如果不经过特殊处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一.线程间通信可以使系统之间的交互性更强大,在大大提高CPU利用率的同时还会使程序员对各 ...

  2. Java笔记(二十)……线程间通信

    概述 当需要多线程配合完成一项任务时,往往需要用到线程间通信,以确保任务的稳步快速运行 相关语句 wait():挂起线程,释放锁,相当于自动放弃了执行权限 notify():唤醒wait等待队列里的第 ...

  3. Java线程间通信-回调的实现方式

    Java线程间通信-回调的实现方式   Java线程间通信是非常复杂的问题的.线程间通信问题本质上是如何将与线程相关的变量或者对象传递给别的线程,从而实现交互.   比如举一个简单例子,有一个多线程的 ...

  4. Java多线程:线程间通信之Lock

    Java 5 之后,Java在内置关键字sychronized的基础上又增加了一个新的处理锁的方式,Lock类. 由于在Java线程间通信:volatile与sychronized中,我们已经详细的了 ...

  5. Java 里如何实现线程间通信

    正常情况下,每个子线程完成各自的任务就可以结束了.不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了. 本文涉及到的知识点:thread.join(), object.w ...

  6. Java多线程编程(三)线程间通信

    线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...

  7. Java多线程编程核心技术-第3章-线程间通信-读书笔记

    第 3 章 线程间通信 线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大 ...

  8. Net线程间通信的异步机制

    线程间通信 我们看下面的图 我们来看线程间通信的原理:线程(Thread B)和线程(Thread A)通信, 首先线程A 必须实现同步上下文对象(Synchronization Context), ...

  9. 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题

    调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...

随机推荐

  1. R语言实战(四)—— 基本数据管理

    一.基础操作 1.根据数据信息,创建数据框 > manager <- c(1,2,3,4,5) > date <- c("10/24/08","1 ...

  2. 所生成项目的处理器架构“MSIL”与引用“Microsoft.AspNet.Scaffolding.12.0, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=x86”的处理器架构“x86”不匹配。

    生成成功后: 3>C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): ...

  3. int和Integer有什么区别?

    Java提供两种不同的类型:引用类型和原始类型(或内置类型): int是Java的原始数据类型,Integer是java为int提供的封装类. java为每个原始类型提供了封装类: 原始类型:bool ...

  4. ajax 跨域----好用的解决方案

    一.前言 跨域这个词就一直以很高的频率在身边重复出现,一直到现在,已经调试过N个跨域相关的问题了! 但是感觉还是差了点什么,于是现在重新梳理了一下.个人见识有限,如有差错,请多多见谅 二.前言 关于跨 ...

  5. HDFS 安全模式的理解

    安全模式是hadoop的一种保护机制,用于保证集群中的数据块的安全性. 当集群启动的时候,会首先进入安全模式.当系统处于安全模式时会检查数据块的完整性.假设我们设置的副本数(即参数dfs.replic ...

  6. 4.数码相框-freetype多行显示,居中显示

    本章主要内容如下: 1)多行显示 2)居中显示 在上章3.数码相框-通过freetype库实现矢量显示里,我们使用矢量坐标时,该坐标仅仅在原点位置处,所以文字有可能会超出坐标,如下图所示: 既然超出了 ...

  7. Java高级类特性(一)

    一.继承性 1)继承的使用:权限修饰符 class A extends B{}:2)子类:A 父类(基类 SuperClass):B3)子类继承父类后,父类中声明的属性.方法,子类都可以获取到明确:当 ...

  8. 【RabbitMQ】5、RabbitMQ任务分发机制

    当有Consumer需要大量的运算时,RabbitMQ Server需要一定的分发机制来balance每个Consumer的load.接下来我们分布讲解. 应用场景就是RabbitMQ Server会 ...

  9. 【shell编程】1、shell编程简介

    Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的.Shell既是一种命令语言,又是一种程序设计语言.作为命令语言,它交互式地解释 ...

  10. code for qint function

    function [p,y,a] = qint(ym1,y0,yp1) %QINT - quadratic interpolation of three adjacent samples % % [p ...