C++ 现代教程二

线程支持库 - C++中文 - API参考文档

GitHub - microsoft/GSL: Guidelines Support Library

Fluent C++:奇异递归模板模式(CRTP) - 简书


#include <thread>
#include <iostream>
#include <unordered_map>
#include <future>
#include <functional>// atomic 有两个功能:原子 & 内存序
// 原子的作用:保证对一个变量操作期间,其他线程不会对此变量操作,那就称为原子操作
// 内存序的作用:构造一个事件发生先后的顺序关系// 大多数普通的变量都不用是原子的,只有一个变量被多个线程同时访问(且其中一个是有副作用的写访问)时,才需要把它变成原子变量
// 所有其他变量,如果也设为原子的话,CPU 的压力会非常大,必须时时刻刻提心吊胆,编译器也会难以优化
// 我们只需要把少数多个线程同时访问的变量设为原子的就可以,帮 CPU 和编译器明确哪些是需要保证多线程并发访问安全的//  x86 TSO
// CPU,缓存,编译器优化 -> 导致乱序
// 对少数关键变量的内存访问,指定内存序,可以阻断优化,避免这些关键变量的乱序
// 而普通的无关紧要的变量的访问依然可以乱序执行// seq_cst = Sequentially-Consistent 顺序一致模型,总是保证所有内存操作,在所有线程看起来都是同一个顺序
// acquire = 我命令你,如果另一个线程对该变量 release 过,请把他的修改对我当前线程可见
// release = 我命令你,之前当前线程的所有写入操作,必须对所有对该变量 acquire 的线程可见
// acq_rel = acquire + release
// relaxed = 无内存序,仅保证原子性
// https://www.apiref.com/cpp-zh/cpp/thread.html
void testAtomic() {// 保证原子性std::atomic_int flag = 0;std::packaged_task<int()> task([&]() {std::cout << "start from thread" << std::endl;while (flag.load(std::memory_order_relaxed) == 0) // 2 ldr [data];std::cout << "end from thread" << std::endl;return 0;});// get the future of taskstd::future<int> result = task.get_future();    // run task in a threadstd::thread(std::move(task)).detach();result.wait_for(std::chrono::seconds(1));std::cout << "waiting..." << std::endl;//flag.fetch_add(1, std::memory_order::relaxed);  // +=flag.store(1, std::memory_order_relaxed); // 1 str [data]  // =result.wait(); // block until future has arrived// 不相等保存,相等时不操作,更高性能int oldVal = flag.load(std::memory_order_acquire), newVal = 0;while (!flag.compare_exchange_weak(oldVal, newVal, std::memory_order_seq_cst, std::memory_order_relaxed))  // compare_exchange_strong;
}/* cpp  CRTP 模式自动实现 clone
template <class Derived>
struct Pet {void feed() {Derived* that = static_cast<Derived*>(this);that->speak();}
};struct CatPet : Pet<CatPet> {void speak() {puts("Meow!");}
};struct DogPet : Pet<DogPet> {void speak() {puts("Bark!");}
};
*/// 组件模式
struct GameObject;
struct Component {virtual void update(GameObject* go) = 0;virtual ~Component() = default;  // 注意!
};struct GameObject {std::unordered_map<uint64_t, Component*> components;template <class ImplementT>void add(Component* component) {components.emplace_back(getTypeID<ImplementT>, component);}void update() {//for (auto&& c : components) {//	c->update(this);//}}template <class ImplementT>uint64_t getTypeID() {return typeid(ImplementT).hash_code();}template <class T>const T* getComponent() {auto matched = components.find(getTypeID<T>());if (matched == components.end())return nullptr;return static_cast<const T*>(matched->second.get());}
};//MVC 模式是一种架构模式,它将应用程序分为三个核心部分:模型(Model)、视图(View)和控制器(Controller),通过分离应用程序的输入、处理和输出来提高应用程序的可维护性和可扩展性。
//
//- 模型(Model):负责处理数据和业务逻辑,通常由数据结构和数据库组成。
//- 视图(View):负责展示数据和用户界面,通常由 HTML、CSS 和 JavaScript 组成。
//- 控制器(Controller):负责处理用户交互和调度模型和视图,通常由后端语言(如 PHP、Java 等)实现。// C++20 开始
// Student stu{.name = "小彭老师", .age = 24, .id = 9999};// 在 map 中使用 `[]` 查找元素,如果不存在,会自动创建一个默认值// 多返回值用结构体替换,禁用tuple
struct from_chars_result {const char* ptr;int ec;
};from_chars_result from_chars(const char* first, const char* last, int& value);// 常量数组传参
//template <class Arr>
//concept has_data_size = requires (Arr arr) {
//	{ arr.data() } -> std::convertible_to<char*>;
//	{ arr.size() } -> std::same_as<size_t>;
//};struct Span {
char* data;
size_t size;template <size_t N>
Span(char(&buf)[N]) : data(buf), size(N) {}
template <size_t N>
Span(std::array<char, N>& arr) : data(arr.data()), size(N) {}Span(std::vector<char>& vec) : data(vec.data()), size(vec.size()) {}// 如果有需要,也可以显式写出 Span(buf, 30) 从首地址和长度构造出一个 Span 来
explicit Span(char* data, size_t size) : data(data), size(size) {}//template <has_data_size Arr>
//Span(Arr&& arr) : data(arr.data()), size(arr.size()) {}Span subspan(size_t start, size_t length = (size_t)-1) const {if (start > size)  // 如果起始位置超出范围,则抛出异常throw std::out_of_range("subspan start out of range");auto restSize = size - start;if (length > restSize) // 如果长度超过上限,则自动截断length = restSize;return Span(data + start, restSize + length);
}
};template <class B>
struct GunWithBullet {static_assert(is_base_of<Bullet, B>::value, "B 必须是 Bullet 的子类");
};// finally
template <class Callback>
struct Finally {Callback func;bool valid;Finally() : func(), valid(false) {}Finally(Callback func) : func(func), valid(true) {}Finally(Finally&& that) noexcept : func(std::move(that.func)), valid(that.valid) {that.valid = false; // 如果要支持移动语义,必须有个 bool 变量表示空状态!}Finally& operator=(Finally&& that) noexcept {if (this != &that) {if (valid) {func();}func = std::move(that.func);valid = that.valid;that.valid = false;}return *this;}void cancel() {valid = false;}void trigger() {if (valid) {func();}valid = false;}~Finally() {if (valid) {func();}}
};template <class Callback> // C++17 CTAD
Finally(Callback) -> Finally<Callback>;// https://github.com/microsoft/GSL   指针区分
void test() {Finally cb = [] {std::cout << ("调用了 Finally 回调") << std::endl;};std::shared_ptr<void> dtor(nullptr, [](void*) {std::cout << "test ~ctor" << "\n"; });testAtomic();
}

输出

start from thread
waiting...
end from thread

其它

CRTP (Curiously Recurring Template Pattern / 奇异递归模板模式)。基类模板参数包含派生类型的,这种就是传说中的 CRTP。包含派生类型是为了能调用派生类的某些函数
decltype(a)   返回 A const &
std::decay_t<decltype(a)>   返回 A

参考

现代 C++ 使用教程-CSDN博客

- [C++ 官方文档](https://en.cppreference.com/w/)
- [C++ 核心开发规范](https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md)
- [Effective Mordern C++ 中文版](https://github.com/kelthuzadx/EffectiveModernCppChinese/blob/master/4.SmartPointers/item22.md)
- [热心观众整理的学习资料](https://github.com/jiayaozhang/OpenVDB_and_TBB)
- [HackingCpp 图文教程](https://hackingcpp.com/)
- [LearnCpp 基础教程](https://www.learncpp.com/cpp-tutorial/)
- [LearnCpp 中文版](https://learncpp-cn.github.io/)
- [Performance Analysis and Tuning on Modern CPUs](http://faculty.cs.niu.edu/~winans/notes/patmc.pdf)
- [C++ 并发编程实战](https://www.bookstack.cn/read/Cpp_Concurrency_In_Action/README.md)
- [深入理解计算机原理 (CSAPP)](http://csapp.cs.cmu.edu/)
- [并行体系结构与编程 (CMU 15-418)](https://www.bilibili.com/video/av48153629/)
- [因特尔 TBB 编程指南](https://www.inf.ed.ac.uk/teaching/courses/ppls/TBBtutorial.pdf)
- [CMake “菜谱”](https://www.bookstack.cn/read/CMake-Cookbook/README.md)
- [CMake 官方文档](https://cmake.org/cmake/help/latest/)
- [Git 官方文档](https://git-scm.com/doc)
- [GitHub 官方文档](https://docs.github.com/en)
- [实用网站 CppInsights 解构 C++ 语法糖](https://cppinsights.io)
- [实用网站 GodBolt 查看不同编译器生成的汇编](http://godbolt.org)


创作不易,小小的支持一下吧!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验10 IPv4地址 — 构造超网(无分类编址)

一、实验目的 1.加深对构造超网的理解&#xff1b; 二、实验要求 1.使用Cisco Packet Tracer仿真平台&#xff1b; 2.观看B站湖科大教书匠仿真实验视频&#xff0c;完成对应实验。 三、实验内容 1.构建网络拓扑&#xff1b; 2.根据各网络所指定的地址块完成以下工作&#…

pytest测试框架pytest-cov插件生成代码覆盖率

Pytest提供了丰富的插件来扩展其功能&#xff0c;本章介绍下pytest-cov插件&#xff0c;用于生成测试覆盖率报告&#xff0c;帮助开发者了解哪些部分的代码被测试覆盖&#xff0c;哪些部分还需要进一步的测试。 pytest-cov 支持多种报告格式&#xff0c;包括纯文本、HTML、XML …

Studying-代码随想录训练营day24| 93.复原IP地址、78.子集、90.子集II

第24天&#xff0c;回溯算法part03&#xff0c;牢记回溯三部曲&#xff0c;掌握树形结构结题方法&#x1f4aa; 目录 93.复原IP地址 78.子集 90.子集II 总结 93.复原IP地址 文档讲解&#xff1a;代码随想录复原IP地址 视频讲解&#xff1a;手撕复原IP地址 题目&#xff1…

音视频入门基础:H.264专题(4)——NALU Header:forbidden_zero_bit、nal_ref_idc、nal_unit_type简介

音视频入门基础&#xff1a;H.264专题系列文章&#xff1a; 音视频入门基础&#xff1a;H.264专题&#xff08;1&#xff09;——H.264官方文档下载 音视频入门基础&#xff1a;H.264专题&#xff08;2&#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…

微服务-网关Gateway

个人对于网关路由的理解&#xff1a; 网关就相当于是一个项目里面的保安&#xff0c;主要作用就是做一个限制项。&#xff08;zuul和gateway两个不同的网关&#xff09; 在路由中进行配置过滤器 过滤器工厂&#xff1a;对请求或响应进行加工 其中filters&#xff1a;过滤器配置…

docker配置国内镜像加速器

1、搜索阿里云 2、搜索容器镜像服务 点击管理控制台 配置镜像加速器

【ARM CoreLink 系列 7.2 -- TZC-400 错误状态寄存器使用详细介绍】

文章目录 TZC-400 错误信息使用Fail address low registerFail address high registerFail control registerFail ID registerTZC-400 错误信息使用 Fail address low register 在 ARM TZC-400 设备中,每个过滤单元都有一个 fail_address_low_<x> 寄存器,其中 <x&g…

distance delayed sound

distance delayed sound 在本章中&#xff0c;我们将讨论在游戏音频中使用距离延迟的重要性。我们将首先通过一个常见的例子——闪电和雷鸣&#xff0c;来展示这种重要性并解释距离延迟音频的基础知识。我们将讨论计算速度、距离和时间的数学和方程式&#xff0c;以确定距离延迟…

【漏洞复现】安美数字酒店宽带运营系统——命令执行漏洞(CNVD-2021-37784)

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 安美数字酒店宽带运营系统 server_ping.php 存在远程命令执行漏洞&#…

【TB作品】温度DS18B20读取,温控风扇,ATMEGA128单片机,Proteus仿真

读取温度&#xff1b; PWM风扇控制&#xff1b; 蜂鸣器控制。 写博客介绍这个基于ATmega128的作品时&#xff0c;可以从以下几个方面展开描述&#xff1a; 概述 介绍项目的背景和目的&#xff0c;说明使用ATmega128的原因以及项目的整体架构。 硬件设计 主要元件 详细列出…

高性能并行计算华为云实验五:PageRank算法实验

目录 一、实验目的 二、实验说明 三、实验过程 3.1 创建PageRank源码 3.2 makefile的创建和编译 3.3 主机配置文件建立与运行监测 四、实验结果与分析 4.1 采用默认的节点数量及迭代次数进行测试 4.2 分析并行化下节点数量与耗时的变化规律 4.3 分析迭代次数与耗时的变…

Elasticsearch开启认证|为ES设置账号密码|ES账号密码设置|ES单机开启认证|ES集群开启认证

文章目录 前言单节点模式开启认证生成节点证书修改ES配置文件为内置账号添加密码Kibana修改配置验证 ES集群开启认证验证 前言 ES安装完成并运行&#xff0c;默认情况下是允许任何用户访问的&#xff0c;这样并不安全&#xff0c;可以为ES开启认证&#xff0c;设置账号密码。 …

加速科技Flash存储测试解决方案 全面保障数据存储可靠性

Flash存储芯片 现代电子设备的核心数据存储守护者 Flash存储芯片是一种关键的非易失性存储器&#xff0c;作为现代电子设备中不可或缺的核心组件&#xff0c;承载着数据的存取重任。这种小巧而强大的芯片&#xff0c;以其低功耗、可靠性、高速的读写能力和巨大的存储容量&…

AttGAN实验复现 2024

AttnGAN 代码复现 2024 文章目录 AttnGAN 代码复现 2024简介环境python 依赖数据集TrainingPre-train DAMSMTrain AttnGAN SamplingB_VALIDATION 为 False (默认)B_VALIDATION 为 True 参考博客 简介 论文地址&#xff1a; https://arxiv.org/pdf/1711.10485.pdf 代码 python…

Amazon OpenSearch Service 现在支持 JSON Web Token(JWT)身份验证和授权

最近&#xff0c;Amazon OpenSearch 推出了一个新功能&#xff0c;支持 JWT 认证和授权。虽然这个功能在开源的 OpenSearch 中早已存在&#xff0c;但在托管的 Amazon OpenSearch 中的实现一直不够理想。 此前的授权方式 控制台登录 内部数据库&#xff1a;使用基本的用户名…

【机器学习】机器学习的重要方法——强化学习:理论,方法与实践

目录 一、强化学习的核心概念 二、强化学习算法的分类与示例代码 三.强化学习的优势 四.强化学习的应用与挑战 五、总结与展望 强化学习&#xff1a;理论&#xff0c;方法和实践 在人工智能的广阔领域中&#xff0c;强化学习&#xff08;Reinforcement Learning, RL&…

Redis-实战篇-编码解决商铺查询的缓存穿透问题(缓存空对象)

文章目录 1、缓存穿透2、常见的解决方案有两种&#xff1a;2.1、缓存空对象2.2、布隆过滤器 3、编码解决商铺查询的缓存穿透问题3.1、queryById3.2、RedisConstants.java 1、缓存穿透 缓存击穿是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效…

【每日刷题】Day77

【每日刷题】Day77 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. LCR 159. 库存管理 III - 力扣&#xff08;LeetCode&#xff09; 2. LCR 075. 数组的相对排序 - 力…

架构师篇-9、从事件风暴到微服务设计的落地过程

用户付款功能第二个版本的设计实现 单一职责原则&#xff08;SRP&#xff09; 软件系统中的每个元素只完成自己职责内的事&#xff0c;将其他的事交给别人去做“职责”通常人理解为一个事情&#xff0c;与该事情相关的事都是它的责任 一个职责是软件变化的一个原因 第二次需求…

test——认识测试

目录 前言 一什么是测试 1测试场景 2为什么需要测试 3测试定义 二测试的岗位 1测开与测试 2测试与开发的区别 a工作内容 b难易程度 c其它不同 三测试人员具备的素质 1综合能力 a沟通能力 b快速学习能力 c开发能力 d文字能力 2掌握自动化测试技术 前言 互联⽹…