一、原子操作

g++;

g+=1;

g = g+1;//结果不对

一般原子操作针对++,--,+=,&=,|=,^=是支持的,其他的可能不支持

二、std::async深入

用来创建异步任务。

 #include <iostream>
#include <thread>
using namespace std; int mythread(){
cout<<"mythread is begining"<<endl;
return ;
} int main(){
std::future<int> result = std::async(mythread);//默认std::launch::async | std::launch::defered
cout<<result.get()<<endl;
}

1、async参数

延迟调用:std::launch::defered

 #include <iostream>
#include <thread>
using namespace std; int mythread(){
cout<<"mythread is begining"<<endl;
return ;
} int main(){
std::future<int> result = std::async(std::launch::defered,mythread);//延迟调用,不创建新线程,只有调用了get/wait函数时,才会执行线程入口函数
cout<<result.get()<<endl;
}

强制创建一个线程 std::launch::async

#include <iostream>
#include <thread>
using namespace std; int mythread(){
cout<<"mythread is begining"<<endl;
return ;
} int main(){
std::future<int> result = std::async(std::launch::async,mythread);//强制异步任务在新线程上执行,意味着系统必须要创建出新线程来运行线程入口函数
cout<<result.get()<<endl;
}

std::launch::async | std::launch::defered

 #include <iostream>
#include <thread>
using namespace std; int mythread(){
cout<<"mythread is begining"<<endl;
return ;
} int main(){
// |意味着,调用async的行为可能创建新线程,也有可能不创建,系统自行选择
std::future<int> result = std::async(std::launch::async | std::launch::defered,mythread);
cout<<result.get()<<endl;
}

不带参数同std::launch::async | std::launch::defered一样,系统会自行决定是异步(创建新线程)还是同步(不创建新线程)方式运行。

2、async和thread区别

thread是专门来创建线程的,如果系统资源紧张,thread创建线程可能会失败,执行therad时整个程序可能崩溃;而async不加额外参数的调用就不会创建新线程,而是后续谁调用了get函数来请求结果,这个异步任务mythread就运行在这条get语句所在的线程上(如get在main中,那么就相当于在主线程中调用mythread函数)

async一般不叫创建线程,叫创建一个异步任务。

最明显的不同:async有时候并不创建线程,例如上面的代码中,只有调用了get函数时,才会创建线程,否则就不会执行。

如果想要接thread返回的一个值,还必须设一个全局变量来赋值。async容易拿到线程函数的返回值

线程数量不能超过100~200,时间片的存在,

3、async不确定性

判断async有没有创建线程?

使用wait_for()

#include <iostream>
#include <thread>
using namespace std; int mythread(){
cout<<"mythread is begining"<<endl;
return ;
} int main(){
std::future<int> result = std::async(mythread);
//result.wait_for(10s),(10min)都可以
std::future_status status=result.wait_for(std::chrono::seconds());//0ms
if(status==std::future_status::deferred){
//没有立即创建线程,延迟执行了
cout<<result.get()<<endl;
}
else{
//线程没有延迟 //线程运行完了
if(status==std::future_status::ready){
//线程运行完了,成功返回
}
else if(status==std::future_status::timeout){
//超时,线程还没执行完,等线程执行完sleep }
} }

十一、atomic、async深入的更多相关文章

  1. ReactiveSwift源码解析(十一) Atomic的代码实现以及其中的Defer延迟、Posix互斥锁、递归锁

    本篇博客我们来聊一下ReactiveSwift中的原子性操作,在此内容上我们简单的聊一下Posix互斥锁以及递归锁的概念以及使用场景.然后再聊一下Atomic的代码实现.Atomic主要负责多线程下的 ...

  2. spring boot 学习(十一)使用@Async实现异步调用

    使用@Async实现异步调用 什么是”异步调用”与”同步调用” “同步调用”就是程序按照一定的顺序依次执行,,每一行程序代码必须等上一行代码执行完毕才能执行:”异步调用”则是只要上一行代码执行,无需等 ...

  3. qemu进程页表和EPT的同步问题

    背景分析: 在之前分析EPT violation的时候,没有太注意qemu进程页表和EPT的关系,从虚拟机运行过程分析,虚拟机访存使用自身页表和EPT完成地址转换,没有用到qemu进程页表,所以也就想 ...

  4. asp.net core 系列之Dependency injection(依赖注入)

    这篇文章主要讲解asp.net core 依赖注入的一些内容. ASP.NET Core支持依赖注入.这是一种在类和其依赖之间实现控制反转的一种技术(IOC). 一.依赖注入概述 1.原始的代码 依赖 ...

  5. 并发编程从零开始(十一)-Atomic类

    并发编程从零开始(十一)-Atomic类 7 Atomic类 7.1 AtomicInteger和AtomicLong 如下面代码所示,对于一个整数的加减操作,要保证线程安全,需要加锁,也就是加syn ...

  6. ES6入门十一:Generator生成器、async+await、Promisify

    生成器的基本使用 生成器 + Promise async+await Promise化之Promisify工具方法 一.生成器的基本使用 在介绍生成器的使用之前,可以简单理解生成器实质上生成的就是一个 ...

  7. linux基础-第十一单元 系统监控

    第十一单元 系统监控 系统监视和进程控制工具-top和free top命令的功能 TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序 ...

  8. Gulp使用入门操作十一步压缩JS

    前提需要安装nodejs 一. 全局安装Gulp npm install -g gulp 二.新建一个 gulpfile.js 文件 chapter2└── gulpfile.js 三.在 gulpf ...

  9. atomic, spinlock and mutex性能比较

    我非常好奇于不同同步原理的性能,于是对atomic, spinlock和mutex做了如下实验来比较: 1. 无同步的情况 #include <future> #include <i ...

随机推荐

  1. 阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第1节 基础加强_4_Junit_@Before&@After

    为了演示输出一段话 测试add的方法 虽然报错了 但是打印的结果还是输出

  2. Linux - 创建交换分区 swap

    购买的 1GB 内存的 Linux 小机器,在编译安装 PHP 的时候内存捉急,只好开启 swap 交换分区来增大内存. [root@VM_139_38_centos php-7.2.12]# cat ...

  3. Model Inversion Attack Paper Indexpage

    Paper [1]: White-box neural network attack, adversaries have full access to the model. Using Gradien ...

  4. 兼容IE浏览器保存Cookie

    兼容IE:Response.Cookies[":member"].Expires=DateTime.Now.AddDays(1); 其它浏览器:Response.Cookies[& ...

  5. 时间、金钱在java、数据库中的变量类型之总结

    在编写程序时,总是有些变量的类型搞不很明白,现将目前涉及到的变量总结一下: 1.“时间”类型 (1).在数据库中的变量类型是:DateTime 比如: operateTime DATETIME,//数 ...

  6. JAVA总结--java基本语法

    static :静态的~ static :静态变量.静态方法: 被修饰的成员变量或者方法独立于该类的任何对象,只要该类被加载,被修饰的成员变量或者方法就存在并可以使用.  用public修饰的stat ...

  7. jfinal+H5的websocket 实现同一账户在不同地点不同电脑只能登陆一个(互相踢下线)

    jfinal+H5的websocket 实现同一账户在不同地点不同电脑只能登陆一个(互相踢下线):https://blog.csdn.net/liuyifeng1920/article/details ...

  8. 小白学Python(11)——pyecharts,绘制饼图 Pie

    Pie-基本示例 from example.commons import Faker from pyecharts import options as opts from pyecharts.char ...

  9. Vue源码解读之Dep,Observer和Watcher

    在解读Dep,Observer和Watcher之前,首先我去了解了一下Vue的数据双向绑定,即MVVM,学习于:https://blog.csdn.net/u013321...以及关于Observer ...

  10. spark浅谈(3):

    一.shuffle操作 1.spark中特定的操作会触发我们都知道的shuffle事件,shuffle是spark进行数据重新分布的机制,这通常涉及跨执行程序和机器来赋值数据,使得混洗称为复杂而且昂贵 ...