• std::atomic
  • std::async

std::atomic

一般atomic原子操作,针对++,--,+=,^=是支持的,其他结果可能不支持。

注意

std::atomic<int> g_varibale = 0;

....
int f(){
g_varibale = g_varibale +1; //这样的写法有问题
}

  很多时候,写程序简单就是美,不太建议把程序写得复杂。多线程程序要求稳定,然后在稳定的基础上去扩展功能。

std::async参数详解

async是用来创建一个异步任务,比如

int mythread()
{
cout << "This thread "<<std::this_thread::get_id()<<endl;
return 1;
}

  在main中:

std::future<int> result = std::async(mythread);
cout << result.get()<<endl;

  程序的执行结果为1)启动一个线程 2)最终线程返回1。

延迟调用的参数:std::launch::deferred,以及std::launch::async 这个参数是强制创建一个线程。

std::thread是用来创建一个线程的,如果创建线程过多,系统资源紧张,那么创建线程就会失败,那么程序就会失败,那么执行std::thread时程序可能崩溃。

std::async一般不叫它创建线程,一般是创建一个异步任务,有时候并不创建新的线程。

a) 如果用std::launch::deferred来调用async,用了deferred之后是延迟调用,并且不创建新线程,延迟到future对象调用get或者wait的时候才执行函数。

b) std::launch::async,强制异步任务在新线程上执行,这意味着系统必须要创建出新线程来执行函数。

c) 如果同时用到deferred和async,即std::launch::async | std::launch::deferred,此时"或":意味着调用async的行为可能是创建新线程并立即执行,或者是没有创建新线程,并且延迟调用,直到get时候才开始执行任务,两者居其一。系统会根据一定的因素,自动分配。此时有不确定性,那么写程序的时候就要注意是否创建新线程来运行。

d) 如果不带而外参数,只给async函数一个入口函数名。当没有指定async和deferred,默认值是c)中两者都有的效果完全一致,系统会自行决定是同步还是异步执行。如果是异步,那么创建新线程,而如果是同步,那么不创建新线程。

e)系统如何决定是异步还是同步?

std::thread是一定会创建线程,a)如果系统资源紧张,那么程序会报异常,然后程序退出。 b)用thread创建线程,往往会复制变量到线程中,如果要拿到返回值,需要一个全局量或者其他方式。std::async和std::thead不同,async是创建一个异步任务,可能创建线程,也可能不创建线程,并且async调用方法,很容易得到线程的返回值,这个是async的优势。由于系统资源限制,

(1)如果用std::thread创建的线程太多,创建失败时,系统崩溃。

(2)如果用async就不会报异常,如果系统资源紧张,导致无法创建新的线程,这种不加额外参数的调用,就不会创建新线程,而是后续谁调用了get,这个异步任务就运行在执行这条get的语句所在的线程上。

(3)一个程序里,线程数量不应超过100-200。

std::async不确定性的解决

不加额外参数的std::async,让系统自行决定是否创建新线程,存在不确定性,写程序的时候就会出现问题。

问题的焦点在于std::future<int> result = std::async(mythread)这个异步任务是否被推迟执行,std::future对象的wait_for 函数

C++并发与多线程学习笔记--atomic的更多相关文章

  1. C++并发与多线程学习笔记--future成员函数、shared_future、atomic

    std::future的其他成员函数 std::shared_future 原子操作.概念.基本用法 多线程主要是为了执行某个函数,本文的函数的例子,采用如下写法 int mythread() { c ...

  2. C++并发与多线程学习笔记--基本概念和实现

    基本概念 并发 可执行程序.进程.线程 学习心得 并发的实现方法 多进程并发 多线程并发 总结 C++标准库 基本概念 (并发.进程.线程)区分C++初级编程和中高级编程 并发 两个或者更多的任务同时 ...

  3. C++并发与多线程学习笔记--互斥量、用法、死锁概念

    互斥量(mutex)的基本概念 互斥量的用法 lock(), unlock() std::lock_guard类模板 死锁 死锁演示 死锁的一般解决方案 std::lock()函数模板 std::lo ...

  4. C++并发与多线程学习笔记--单例设计模式、共享数据分析

    设计模式 共享数据分析 call_once 设计模式 开发程序中的一些特殊写法,这些写法和常规写法不一样,但是程序灵活,维护起来方便,别人接管起来,阅读代码的时候都会很痛苦.用设计模式理念写出来的代码 ...

  5. C++并发与多线程学习笔记--多线程数据共享问题

    创建和等待多个线程 数据和共享问题分析 只读的数据 有读有写 其他案例 共享数据的保护案例代码 创建和等待多个线程 服务端后台开发就需要多个线程执行不同的任务.不同的线程执行不同任务,并返回执行结果. ...

  6. C++并发与多线程学习笔记--参数传递详解

    传递临时对象 陷阱 总结 临时对象作为线程参数 线程id的概念 临时对象构造时的抓捕 成员函数指针做线程函数 传递临时对象作为线程参数 创建的工作线程不止一个,线程根据编号来确定工作内容.每个线程都需 ...

  7. C++并发与多线程学习笔记--async、future、packaged_task、promise

    async future packaged_task promise async std:async 是个函数,用来启动一个异步任务,启动起来一个异步任务之后,返回一个std::futre对象,启动一 ...

  8. C++并发与多线程学习笔记--线程之间调度

    condition_variable wait() notify_one notify_all condition_variable 条件变量的实际用途: 比如有两个线程A和B,在线程A中等待一个条件 ...

  9. C++并发与多线程学习笔记--unique_lock详解

    unique_lock 取代lock_quard unique_lock 的第二个参数 std::adopt_lock std::try_to_lock std::defer_lock unique_ ...

随机推荐

  1. Event Bus & Event Emitter

    Event Bus & Event Emitter Event Bus https://code.luasoftware.com/tutorials/vuejs/parent-call-chi ...

  2. windows 设置右键菜单

    编辑注册表 在文件 右键菜单中添加 xx.reg: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\vscode] &q ...

  3. js 如何取消promise

    1: 使用reject function hello() { let _res, _rej: any; const promise = new Promise((res, rej) => { _ ...

  4. 「NGK每日快讯」11.18日NGK公链第15期官方快讯

  5. 画一个PBN大角度飞越转弯保护区

      今天出太阳了,尽管街上的行人依旧很少,但心情开始不那么沉闷了.朋友圈里除了关注疫情的最新变化之外,很多人已经开始选择读书或是和家人一起渡过这个最漫长的春节假期.陕西广电网络春节期间所有点播节目一律 ...

  6. C++算法代码——骨牌铺法

    题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1638 题目描述 输入 输入一个正整数,表示n. 输出 输出一个正整数,表示铺法. 样 ...

  7. TERSUS无代码开发(笔记05)-简单实例电脑端页面设计

    案例笔记电脑端页面设计   1.新建项目(请假管理qjgl)   2.开发软件界面介绍(常用的功能按键)      3.目录中显示元件对象      4.对元件对象的操作主要方式是双击(双击哪个元件, ...

  8. Java常用类:Arrays类

    一.简介 全类名:java.util.Arrays 描述: 此类包含用来操作数组(比如排序和搜索)的各种方法. 此类还包含一个允许将数组作为列表来查看的静态工厂. 注意: 除非特别注明,否则如果指定数 ...

  9. C++Template 模版的本质

    我想知道上帝的構思,其他的都祇是細節.                                                                                  ...

  10. 使用Maven新建SpringBoot工程

    最近用IDEA插件创建Springboot项目,总是403,估计被墙了! 那么这里在提供两种方法 1.从官网下载模板,导入IDEA内 2.使用Maven创建 方法一:打开 https://start. ...