C++11并发与多线程笔记(11) std::atomic续谈、std::async深入谈

news2024/11/17 0:07:34

C++11并发与多线程笔记(11) std::atomic续谈、std::async深入谈

  • 1、std::atomic续谈
  • 2、std::async深入理解
    • 2.1 std::async参数详述
    • 2.2 std::async和std::thread()区别:
    • 2.3 async不确定性问题的解决

1、std::atomic续谈

#include <iostream>
#include <thread>
#include <atomic>
using namespace std;
std::atomic<int> g_count = 0; //封装了一个类型为int的 对象(值)
 
void mythread1() {
	for (int i = 0; i < 1000000; i++) {
		 //虽然g_count使用了原子操作模板,但是这种写法既读又写,
		 //会导致计数错误
         g_count = g_count + 1;
	}
}

int main() {
	std::thread t1(mythread1);
	std::thread t2(mythread1);
	t1.join();
	t2.join();
	cout << "正常情况下结果应该是200 0000次,实际是" << g_count << endl;
}

在这里插入图片描述
注意:一般atomic原子操作,针对++,–,+=,-=,&=,|=,^=是支持的,其他操作不一定支持

2、std::async深入理解

2.1 std::async参数详述

async 用来创建一个异步任务,其中延迟调用参数 std::launch::deferred【延迟调用】,std::launch::async【强制创建一个线程】

std::async()我们一般不叫创建线程(它能够创建线程),我们一般叫它创建一个异步任务

std::async和std::thread最明显的不同,就是 async 有时候并不创建新线程,在主线程中执行。

  1. 如果用std::launch::deferred 来调用async?
    延迟到调用 get() 或者 wait() 时执行,如果不调用get() 或者 wait() 就不会执行。

  2. 如果用std::launch::async来调用async?
    强制这个异步任务在新线程上执行,这意味着,系统必须要创建出新线程来运行线程入口函数。

  3. 如果同时用 std::launch::async | std::launch::deferred
    这里这个 | 意味着async的行为可能是 std::launch::async 创建新线程立即执行,也可能是 std::launch::deferred 没有创建新线程并且延迟到调用get()执行,由系统根据实际情况来决定采取哪种方案。

  4. 不带额外参数 std::async(mythread),只给async 一个入口函数名,此时的系统给的默认值是 std::launch::async | std::launch::deferred 和 第3条 一样,有系统自行决定异步还是同步运行。

2.2 std::async和std::thread()区别:

std::thread():如果系统资源紧张可能出现创建线程失败的情况,如果创建线程失败那么程序就可能崩溃,而且不容易拿到函数返回值(不是拿不到,可能需要全局变量)

std::async():创建异步任务。可能创建线程也可能不创建线程,并且容易拿到线程入口函数的返回值

由于系统资源限制:

  1. 如果用std::thread创建的线程太多,则可能创建失败,系统报告异常,崩溃。

  2. 如果用std::async,一般就不会报异常,因为如果系统资源紧张,无法创建新线程的时候,async不加额外参数的调用方式不会创建新线程。而是在后续谁调用get()请求结果时执行在这个调用get()的线程上。
    如果你强制async一定要创建新线程就要使用 std::launch::async 标记。承受的代价是,系统资源紧张时可能崩溃。

  3. 根据经验,一个程序中线程数量 不宜超过100~200 。

2.3 async不确定性问题的解决

不加额外参数的async调用时让系统自行决定 ,是否创建新线程。
一般来说:async不带参数时,编译器会根据线程资源剩余多少来决定是否创建新线程。

std::future result = std::async(mythread);
问题焦点在于这个写法,任务到底有没有被推迟执行

用通过wait_for返回状态来判断:

std::future_status status = result.wait_for(std::chrono::seconds(0));
//std::future_status status = result.wait_for(0s);
	if (status == std::future_status::timeout) {
		//超时:表示线程还没有执行完
		cout << "超时了,线程还没有执行完" << endl;
	}
	else if (status == std::future_status::ready) {
		//表示线程成功放回
		cout << "线程执行成功,返回" << endl;
		cout << result.get() << endl;
	}
	else if (status == std::future_status::deferred) {
		//这种是延迟调用,没有开启新线程
		cout << "线程延迟执行" << endl;
		cout << result.get() << endl;//主线程中调用mythread()
	}

可以这样写:

std::future_status status = result.wait_for(std::chrono::seconds(0));
//std::future_status status = result.wait_for(0s);
	if (status == std::future_status::deferred) {
		//这种是延迟调用,没有创建新线程
		cout << "线程延迟执行" << endl;
		cout << result.get() << endl;//主线程中调用mythread()
	}else{
		//创建了新线程
		if (status == std::future_status::timeout) {
			//超时:表示线程还没有执行完
			cout << "超时了,线程还没有执行完" << endl;
			cout << result.get() << endl;//超时,来等待
		}else if (status == std::future_status::ready) {
			//表示线程成功放回
			cout << "线程执行成功,返回" << endl;
			cout << result.get() << endl;
		}
	}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/899737.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

核能的发展与应用

目录 1.核能的概念 2.核能的实现原理 3.核能的利与弊 4.核能未来的发展趋势 1.核能的概念 核能是指利用核反应过程中释放出的能量来产生电力或其他形式能量的能源形式。核能主要通过核裂变和核聚变两种方式产生。 1. 核裂变&#xff1a;核裂变是指重核&#xff08;通常是铀、…

智能电视与win10电脑后续无法实现DLNA屏幕共享

问题背景&#xff1a; 我用的是TCL电视&#xff0c;但是并不是最新&#xff0c;打开的方式是U盘->电脑&#xff0c;各位看自己情况&#xff0c;很多问题都大概率是智能电视问题。 情景假设&#xff1a; 假设你已经完成原先智能电视该有的步骤&#xff0c;通过DLNA&#xf…

什么是springMVC 视图和视图解析器

&#x1f600;前言 本篇讲解了什么是springMVC 视图和视图解析器 &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f609;&#x1f60…

【C# 基础精讲】LINQ to XML查询

LINQ to XML 是 C# 中用于查询和操作 XML 数据的强大工具。它允许您使用 LINQ 查询语法对 XML 文档进行查询、过滤、投影等操作&#xff0c;从而更加方便地处理 XML 数据。本文将详细介绍 LINQ to XML 的基本概念、常见操作以及示例&#xff0c;帮助您了解如何在 C# 中使用 LIN…

内核编译bpf

1 cp /boot/config-4.15.0-213-generic . 2 make menuconfig 报错缺少库 2.1 安装flex库 https://github.com/westes/flex/releases/download/v2.6.4/flex-2.6.4.tar.gz ./configure CFLAGS-D_GNU_SOURCE make sudo make install 再次编译 缺少 bison库 2.2 下载 …

图片合成动图怎么弄?gif图制作的简单方法

许多鬼畜的表情包其实是用图片合成gif完成的&#xff0c;那么怎么将图片转gif呢&#xff1f;使用GIF中文网的gif合成&#xff08;https://www.gif.cn&#xff09;功能&#xff0c;打开浏览器就可以完成gif图片制作&#xff0c;非常简单方便&#xff0c;一起来了解一下吧。 打开…

C++笔记之Class A a = b调用的什么构造函数(引例)

C笔记之Class A a b调用的什么构造函数(引例) code review! 文章目录 C笔记之Class A a b调用的什么构造函数(引例)1.C笔记之Class A a b调用的什么构造函数&#xff1f;2.常见的三种形式3.等价的两种形式 1.C笔记之Class A a b调用的什么构造函数&#xff1f; 2.常见的三…

Vue 项目搭建

环境配置 1. 安装node.js 官网&#xff1a;nodejs&#xff08;推荐 v10 以上&#xff09; 官网&#xff1a;npm 是什么&#xff1f; 由于vue的安装与创建依赖node.js&#xff08;JavaScript的运行环境&#xff09;里的npm&#xff08;包管理和分发工具&#xff09;&#xff…

【80天学习完《深入理解计算机系统》】第八天 3.1 机器级代码【汇编指令】【寄存器】【操作数】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

Fluent向CFD-Post输出结果的方法

目前还有较多用户在使用 CFD-Post 进行 Fluent 结果后处理。本文整理了几种常用的 Fluent 向 CFD-Post 输出结果的方法。 本文内容其基于此演示模型进行讲解。 1 直接读取 DAT 文件 CFD-Post 可直接读取 Fluent 的结果文件&#xff0c;包括 .dat 和 .dat.h5 两种格式。其中&…

Jenkins+Jmeter集成自动化接口测试并通过邮件发送测试报告

一、Jenkins的配置 1、新增一个自由风格的项目 2、构建->选择Excute Windows batch command&#xff08;因为我是在本地尝试的&#xff0c;因此选择的windows&#xff09; 3、输入步骤&#xff1a; 1. 由于不能拥有相同的jtl文件&#xff0c;因此在每次构建前都需要删除jtl…

FFmpeg5.0源码阅读——VideoToobox硬件解码

摘要&#xff1a;本文描述了FFmpeg中videotoobox解码器如何进行解码工作&#xff0c;如何将一个编码的码流解码为最终的裸流。   关键字&#xff1a;videotoobox,decoder,ffmpeg   VideoToolbox 是一个低级框架&#xff0c;提供对硬件编码器和解码器的直接访问。 它提供视频…

基于java毕业设计之旅游管理系统(springboot源码+LW+PPT)

项目源码 lwPPT 文章目录 前言一、主要技术javaMysql数据库JSP技术 二、系统设计三、功能截图总结 前言 社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。网络计算机的交易方式逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。互联网具有…

CLion:最好用的c/c++编写工具(最详细安装教程)

目录 一.前言介绍 1.下载安装 1.1右上角点击下载 1.2选择自己操作系统&#xff0c;然后点击下载 1.3选择next 1.4 更改路径 1.5D盘最好 1.6 按照我的选择配置环境 1.7install安装 1.8 安装完成 2、mingw64安装 2.1下载资源压缩包 2.2mingw64放入到合适的位置&#xff0c;…

Python+request+unittest实现接口测试框架集成实例

这篇文章主要介绍了Pythonrequestunittest实现接口测试框架集成实例&#xff0c;小编觉得挺不错的&#xff0c;现在分享给大家&#xff0c;也给大家做个参考。一起跟随小编过来看看吧 1、为什么要写代码实现接口自动化 大家知道很多接口测试工具可以实现对接口的测试&#xf…

使用pnpm workspace管理Monorepo架构

在开发项目的过程中&#xff0c;我们需要在一个仓库中管理多个项目&#xff0c;每个项目有独立的依赖、脚手架&#xff0c;这种形式的项目结构我们称之为Monorepo&#xff0c;pnpm workspace就是管理这类项目的方案之一。 一、pnpm简介 1、pnpm概述 pnpm代表performance npm…

注入Servlet、Filter、Listener的两种方式

文章目录 注入Servlet、Filter、Listener官方文档基本介绍应用实例1-使用注解方式注入需求:应用实例-实现注意: 应用实例2-使用RegistrationBean 方式注入需求:应用实例-实现 注意事项和细节说明原因分析说明 源码分析 注入Servlet、Filter、Listener 官方文档 文档: https:/…

高效mac常用快捷键整理

高效mac常用快捷键整理 macOS全局、剪切、拷贝、粘贴finder 和 系统快捷键文稿 浏览器chrome标签页和窗口快捷键功能快捷键网页快捷键 Idea & Pycharm必记编辑查询&替换导航重构编译、运行、调试 iTerm标签分屏编辑 文本编辑 sublime text导航&#xff1a;打开&关闭…

高级艺术二维码制作教程

最近不少关于二维码制作的&#xff0c;而且都是付费。大概就是一个好看的二维码&#xff0c;扫描后跳转网址。本篇文章使用Python来实现&#xff0c;这么简单花啥钱呢&#xff1f;学会&#xff0c;拿去卖便宜点吧。 文章目录 高级二维码制作环境安装普通二维码艺术二维码动态 …

2023国赛数学建模思路 - 案例:FPTree-频繁模式树算法

文章目录 算法介绍FP树表示法构建FP树实现代码 建模资料 ## 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模式树算法&#xff0c…