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)
创作不易,小小的支持一下吧!
相关文章:

C++ 现代教程二
线程支持库 - C中文 - API参考文档 GitHub - microsoft/GSL: Guidelines Support Library Fluent C:奇异递归模板模式(CRTP) - 简书 #include <thread> #include <iostream> #include <unordered_map> #include <futu…...
JavaScript函数闭包解析
一、什么是闭包 JavaScript中的函数闭包是指函数可以访问其父级作用域中的变量,即使函数在父级作用域外被调用。闭包可以获取和修改其父级作用域中的变量,即使父级作用域已经被销毁。 在JavaScript中,当一个函数被定义时,它会创…...

STM32MP135裸机编程:使用软件触发硬件复位
0 参考资料 STM32MP13xx参考手册.pdf 1 使用寄存器实现软件复位 1.1 复位电路概述 重点关注下面标红的路线: 通过这条路线可以清楚看到,我们可以通过设置RCC_MP_GRSTCSETR寄存器让RPCTL(复位脉冲控制器)给NRST(硬件复…...

【饼图交通方式】用ECharts的graphic配置打造个性化
利用ECharts的graphic配置打造个性化图表 内容概要 ECharts是一款强大的数据可视化工具,它提供了丰富的配置选项来定制图表。本文将重点介绍graphic配置的使用,展示如何通过在饼图中添加个性化的图形元素,例如中心图像,来增强图…...

大模型学习笔记3【大模型】LLaMA学习笔记
文章目录 学习内容LLaMALLaMA模型结构LLaMA下载和使用好用的开源项目[Chinese-Alpaca](https://github.com/ymcui/Chinese-LLaMA-Alpaca)Chinese-Alpaca使用量化评估 学习内容 完整学习LLaMA LLaMA 2023年2月,由FaceBook公开了LLaMA,包含7B࿰…...

工程师 - 什么是SMP
什么是 SMP(对称多处理)? What is SMP (symmetric multiprocessing)? 对称多处理(SMP,symmetric multiprocessing)是由多个处理器完成的计算机处理过程,这些处理器共享一个操作系统࿰…...

Webpack: 并行构建
概述 受限于 Node.js 的单线程架构,原生 Webpack 对所有资源文件做的所有解析、转译、合并操作本质上都是在同一个线程内串行执行,CPU 利用率极低,因此,理所当然地,社区出现了一些以多进程方式运行 Webpack࿰…...

Vue的介绍与使用
1.Vue的介绍 内容讲解 【1】Vue介绍 1.vue属于一个前端框架,底层使用原生js编写的。主要用来进行前端和后台服务器之间的一个交互。 2.Vue是一套构建用户界面的渐进式前端框架。 “渐进式框架”简单的来说你可以将Vue作为你的应用一部分嵌入其中,代理…...
MYSQL双主双从,使用Keepalived双机热备+LVS高可用群集
MYSQL双主双从,使用Keepalived双机热备LVS高可用群集 文档只记录KeepalivedLVSmysql主从,不包含检验,如需检验,请自行添加web服务器 一、IP规划 服务器IP备注master1192.168.100.131master2的从master2192.168.100.132maste…...

9.计算机视觉—目标检测
目录 1.物体检测边缘框目标检测数据集总结边缘框代码实现2.锚框:目标检测的一种方法IoU—交并比赋予锚框标号使用非极大值抑制(NMS)输出总结代码实现1.物体检测 边缘框 一个边缘框可以通过四个数字定义 (左上x,左上y),(右下x,右下y)(左上x,左上y,宽,高)(中间x,中间y…...

构造函数深入理解
目录 构造函数构造函数体赋值初始化列表初始化列表格式初始化列表的意义以及注意点const修饰的成员变量初始化对象成员具体初始化的地方缺省值存在的意义例子1例子2 初始化与赋值引用成员变量的初始化注意点1注意点2我的疑惑 自定义类型成员初始化例子1例子2例子3例子4 初始化列…...

Rocky Linux 9 快速安装docker 教程
前述 CentOS 7系统将于2024年06月30日停止维护服务。CentOS官方不再提供CentOS 及后续版本,不再支持新的软件和补丁更新。CentOS用户现有业务随时面临宕机和安全风险,并无法确保及时恢复。由于 CentOS Stream 相对不稳定,刚好在寻找平替系统…...
go语言并发编程1-Gouroutine
参考文档:www.topgoer.com 使用方法 直接包装成函数,go关键字触发即可 注意事项 1 main方法结束后,main方法内启动的子协程会立即结束,无论是否执行完毕; 启动多个groutine 使用sync包的WaitGroup来控制…...
Sylar服务器框架——Http模块
1、http.h 定义了HttpMethod和HttpStatus /* Request Methods */ #define HTTP_METHOD_MAP(XX) \XX(0, DELETE, DELETE) \XX(1, GET, GET) \XX(2, HEAD, HEAD) \XX(3, POST, POST) \XX(4, PUT, …...

7km远距离WiFi实时图传模块,无人机海上无线传输方案,飞睿智能WiFi MESH自组网技术
在浩瀚无垠的海洋上,无人机正在开启一场前所未有的技术创新。它们不再只是天空的舞者,更是海洋的守望者,为我们带来前所未有的视野和数据。而这一切的背后,都离不开一项创新性的技术——飞睿智能远距离WiFi实时图传模块与无线Mesh…...

2024年上半年网络工程师下午真题及答案解析
试题一(20分) 某高校网络拓扑如下图所示,两校区核心(CORE-1、CORE-2),出口防火墙(NGFW-1、NGFW-2)通过校区间光缆互联,配置OSPF实现全校路由收敛,两校区相距40km。两校区默认由本地…...

Jmeter下载、安装及配置
1 Jmeter介绍 Jmeter是进行负载测试的工具,可以在任何支持Java虚拟机环境的平台上运行,比如Windows、Linux、Mac。 Jmeter模拟一组用户向目标服务器发送请求,并统计目标服务器的性能信息,比如CPU、memory usage。 2 Jmeter下载 …...

掌握高效实用的VS调试技巧
🔥 个人主页:大耳朵土土垚 1.编程常见的错误 1.1编译型错误 编程编译型错误是指在编译代码时发现的错误。编译器在编译过程中会检查代码是否符合语法规范和语义要求,如果发现错误会产生编译错误。 直接看错误提示信息(双击&#…...

实验2 字符及字符串输入输出与分支程序设计实验
字符及字符串输入输出 从键盘输入两个一位十进制数,计算这两个数之和,并将结果在屏幕上显示出来。 分支程序设计 从键盘输入一字符,判断该字符是小写字母、大写字母、数字或者其他字符。若输入为小写字母,显示“You Input a Lo…...

docker容器间网络仿真工具-pumba
docker-tc&pumba docker-tc:docker-tc项目仓库 pumba:pumba项目仓库 这两个项目理论上都可以实现对容器间的网络环境进行各种模拟干预,包括延迟,丢包,带宽限制等。 但是我在实际使用时,发现docker-tc这个工具在进行网络进行模…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...

抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...

【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...

Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...