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.mzph.cn/pingmian/40077.shtml

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

相关文章

区块链加载解析方法

一.区块链加载解析 对于数据的下载主要包括三种方式&#xff1a; 1.实现比特币网络协议&#xff0c;通过该协议和其他比特币全节点建立联系&#xff0c;然后同步区块数据。 2.通过比特币节点提供的API服务下载区块链数据。 3.通过blickchain.com提供的rest服务下载区块数据…

《后端程序猿 · Caffeine 本地缓存》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻一周&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

EE架构大跃进:特斯拉、小鹏引领舱驾融合,从域控融合走向单SoC

作者 |肖恩 编辑 |德新 智能汽车发展到今天&#xff0c;整车电气架构已经从分布式架构逐渐迈向中央集成式架构&#xff0c;传统的小控制器被集成到按功能划分的大域控里&#xff0c;下一个阶段将是跨域的融合&#xff0c;通过不同功能域的集成实现中央计算平台的最终目标。 …

Visual Studio 中的键盘快捷方式

1. Visual Studio 中的键盘快捷方式 1.1. 可打印快捷方式备忘单 1.2. Visual Studio 的常用键盘快捷方式 本部分中的所有快捷方式都将全局应用&#xff08;除非另有指定&#xff09;。 “全局”上下文表示该快捷方式适用于 Visual Studio 中的任何工具窗口。 生成&#xff1…

[leetcode hot 150]第四百五十二题,用最少数量的箭引爆气球

题目&#xff1a; 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。…

[leetcode hot 150]第三题,无重复字符的最长子串

题目&#xff1a; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串的长度。 可以使用"滑动窗口"的方法来解决这个问题。基本思路如下: 使用两个指针(start和end)来定义一个窗口移动end指针来扩大窗口,直到遇到重复字符如果遇到重复字符,移动s…

Vite: 插件流水线之核心编译能力

概述 Vite 在开发阶段实现了一个按需加载的服务器&#xff0c;每一个文件请求进来都会经历一系列的编译流程&#xff0c;然后 Vite 会将编译结果响应给浏览器。在生产环境下&#xff0c;Vite 同样会执行一系列编译过程&#xff0c;将编译结果交给 Rollup 进行模块打包这一系列…

什么是 URL ?

统一资源定位符&#xff08;URL&#xff09;是一个字符串&#xff0c;它指定了一个资源在互联网上的位置以及如何访问它。URL 是由几部分组成的&#xff0c;每部分都有其特定的作用&#xff1a; 协议/方案&#xff1a;这是 URL 的开头部分&#xff0c;表明了用于访问资源的协议…

antfu/ni 在 Windows 下的安装

问题 全局安装 ni 之后&#xff0c;第一次使用会有这个问题 解决 在 powershell 中输入 Remove-Item Alias:ni -Force -ErrorAction Ignore之后再次运行 ni Windows 11 下的 Powershell 环境配置 可以参考 https://github.com/antfu-collective/ni?tabreadme-ov-file#how …

Java---Mybatis详解二

雄鹰展翅凌空飞&#xff0c; 大江奔流不回头。 壮志未酬心未老&#xff0c; 豪情万丈任遨游。 巍巍高山攀顶峰&#xff0c; 滔滔黄河入海流。 风云变幻凭君舞&#xff0c; 踏遍天涯尽逍遥。 目录 一&#xff0c;环境准备 二&#xff0c;删除 三&#xff0c;删除(预编译SQL) 为什…

Celery入门教程

一.Celery介绍 1.Celery架构 Celery架构基于可插拔组件&#xff08;pluggable components&#xff09;和根据选择的消息传输&#xff08;代理&#xff09;(message transport(broker))协议实现的消息交换机制。 2.Celery模块 &#xff08;1&#xff09;任务模块 Task 包含异…

2024中国西安科博会暨硬科技产业博览会11月召开

2024第18届中国西安国际科学技术产业博览会暨硬科技产业博览会 时间&#xff1a;2024年11月3日-5日 地点&#xff1a;西安国际会展中心 主办单位&#xff1a;中国国际科学技术合作协会 陕西省科技资源统筹中心 协办单位&#xff1a;西安市科学技术协会 西安市中小企业协会、…

昇思25天学习打卡营第3天|yulang

今天主要学习03-张量Tensor&#xff0c;主要包含了处理创建张量、张量的属性、张量索引和张量运算&#xff0c;稀疏张量&#xff0c;有点看不太懂&#xff0c;感觉要开始入门到放弃了&#xff1f;张量在构建和训练深度学习模型中的实际应用&#xff0c;如卷积神经网络。 张量&a…

Django学习第三天

python manage.py runserver 使用以上的命令启动项目 实现新建用户数据功能 views.py文件代码 from django.shortcuts import render, redirect from app01 import models# Create your views here. def depart_list(request):""" 部门列表 ""&qu…

一键获取:Win11笔记本系统下载地址!

在笔记本电脑操作中&#xff0c;用户想安装一款适合笔记本电脑使用的Win11系统&#xff0c;但不知道在哪里可以下载到&#xff1f;接下来系统之家小编给大家分享Win11笔记本系统下载地址&#xff0c;有需要的小伙伴一键点击即可获取&#xff0c;快速安装系统&#xff0c;即可体…

<电力行业> - 《第15课:电力领域(一)》

1 电网 发电厂与最终用电用户&#xff08;负荷&#xff09;往往相距很远&#xff0c;因此电力需要由电厂”输送“到最终用户&#xff0c;即“输电环节“&#xff0c;电流的输送往往导致因线路发热造成损耗&#xff0c;所以在输送的时候都是通过变电升高电压&#xff0c;让电流…

计算机网络 | 期末复习

物理层&#xff1a; 奈氏准则&#xff1a;带宽&#xff08;w Hz&#xff09;&#xff0c;在不考虑噪音的情况下&#xff0c;最大速率&#xff08;2W&#xff09;码元/秒 信噪比S/N&#xff1a;以分贝&#xff08;dB&#xff09;为度量单位。信噪比&#xff08;dB&#xff09;…

C++初学者指南-3.自定义类型(第一部分)-异常

C初学者指南-3.自定义类型(第一部分)-异常 文章目录 C初学者指南-3.自定义类型(第一部分)-异常简介什么是异常&#xff1f;第一个示例用途:报告违反规则的行为异常的替代方案标准库异常处理 问题和保证资源泄露使用 RAII 避免内存泄漏&#xff01;析构函数&#xff1a;不要让异…

SpringBoot源码阅读3-启动原理

SpringBootApplication public class DistApplication {public static void main(String[] args) {// 启动入口SpringApplication.run()SpringApplication.run(DistApplication.class, args);} }1、服务构建 这里"服务"指的是SpringApplication对象&#xff0c;服务…

2024年港澳台联考考生成绩数据分析来啦

分数线 出炉 2024年的港澳台联考正式出分&#xff01;根据考生成绩&#xff0c;全国联招划档线如下&#xff1a; 一、本科批次 &#xff08;一&#xff09;普通类院校&#xff08;专业&#xff09;&#xff1a;文史类365分、理工类390分&#xff08;部分院校执行高分线&#…