mutable--泛型编程
mutable–泛型编程1. 定义mutable是C++中的一个关键字,用于修饰类的成员变量。它的作用是允许在const成员函数中修改被mutable修饰的成员变量。
2. 用法mutable关键字通常用于修饰类的成员变量,以便在const成员函数中修改这些变量的值。
12345678class MyClass {public: mutable int mutableVar; void constMemberFunc() const { mutableVar = 10; // 在const成员函数中修改mutableVar的值 }}
仿函数operator--泛型编程
仿函数用法12345678910111213141516171819202122232425262728293031323334353637class A {public: virtual ~A() {} virtual void operator()() { std::cout << "A" << std::endl; }}struct B { void operator()() { std::cout << "B" << std::endl; }}struct C { bool operator==(int a, int b) const { return a == b; }}struct D { int operator()(int a, int b) c ...
std::this_thread 命名空间
std::this_thread问题1: std::this_thread 命名空间下都有哪些线程操作std::this_thread 是 C++11 引入的,专门用于操作当前执行的线程,提供了一系列简洁实用的接口。
一、std::this_thread 核心操作详解std::this_thread 所有接口都定义在 <thread> 头文件中,核心操作分为以下几类:
1. 获取当前线程 ID:get_id()
功能:返回当前线程的唯一标识符(类型为 std::thread::id)。
用途:调试、日志记录、区分不同线程、判断线程是否为主线程等。
示例代码:12345678910111213141516171819202122#include <iostream>#include <thread>#include <vector>void thread_func(int num) { // 获取当前线程ID并打印 std::cout << "线程 " << num < ...
任务唤醒
std::ccondition_variable核心使用思路std::condition_variable(条件变量)的核心作用是让一个/多个线程等待某个条件满足,当条件满足时,由其他线程唤醒等待的线程。关键组合:std::condition_variable + std::mutex + 共享条件(布尔变量/计数器等)。核心唤醒函数:
notify_one():唤醒一个等待的线程(随机/按调度策略)。
notify_all():唤醒所有等待的线程。
完整可运行示例下面通过一个“生产者-消费者”示例,展示如何唤醒等待的任务:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374#include <iostream>#include <thread>#include <mutex>#include ...
线程创建
c++ 线程创建创建线程:
1234567891011121314#include <thread>#include <iostream>void threadFunction() { std::cout << "threadFunction" << std::endl;}int main() { std::thread t(threadFunction); t.join(); return 0;}
问题1: C++ 中创建 std::thread 线程后是否必须调用 join()答案是:不是必须调用 join(),但必须调用 join() 或 detach() 二者之一;如果既不 join 也不 detach,线程对象析构时会触发程序崩溃(调用 std::terminate())。
一、核心原因:std::thread 的析构规则std::thread 设计的核心原则是:不允许「悬空」的线程关联——当 std::threa ...
无题
123# 使用阿里云安装脚本curl --proto '=https' --tlsv1.2 -sSf https://mirrors.aliyun.com/repo/rust/rustup-init.sh | sh
12# 配置环境变量echo 'source "$HOME/.cargo/env"' >> ~/.bashrc
12# 升级rustrustup self update && rustup update
rust 返回值1. 使用 match 模式匹配12345678fn main() { // ... 其他代码 ... match func() { Ok(value) => println!("函数成功,返回值: {}", value), Err(error) => println!("函数失败,错误: {}", er ...
内存管理
页概念在现代计算机系统中,处理器的寻址通常通过 虚拟地址(Virtual Address) 进行,而虚拟地址到物理地址的转换过程涉及“页”(Page)的概念。对于支持内存管理单元(MMU)的处理器(如ARMv7),寻址过程会按照页来划分和管理内存,但具体机制需要结合硬件架构和操作系统来理解。以下是详细说明:
一、处理器寻址的基本概念
虚拟地址与物理地址
虚拟地址:应用程序看到的内存地址(由操作系统分配),范围由处理器位数决定(如32位处理器虚拟地址空间为0~4GB)。
物理地址:实际内存(RAM)的硬件地址,由处理器地址总线宽度决定(如32位处理器物理地址空间通常也是4GB)。
MMU的作用:负责将虚拟地址转换为物理地址,这个过程称为 地址转换(Address Translation)。
分页(Paging)机制
操作系统将虚拟地址空间和物理地址空间划分为固定大小的块,称为 页(Page)。
虚拟地址对应的页称为 虚拟页(Virtual Page),物理地址对应的页称为 物理页(Physical Page)。
页的大小由处理器架构决定(如ARMv7支持4 ...
块IO层
块块设备和字符设备在 Linux 系统中,块设备(Block Device)和字符设备(Character Device)是两种基本的设备分类,用于区分不同类型的硬件设备及其数据交互方式。它们的核心区别在于数据读写的方式、缓冲机制和应用场景。
一、块设备(Block Device)定义块设备是一种以“数据块(Block)”为单位进行随机读写的设备。数据块的大小通常为固定值(如 512字节、4KB 等),设备驱动程序会对数据进行缓冲和缓存,支持按块随机访问(即可以直接读取任意块的数据,无需按顺序)。
特点
数据交互方式
以块(Block)为最小单位读写,块大小由设备硬件决定(如硬盘的扇区通常是 512B 或 4KB)。
支持随机访问:可以直接定位到任意块进行读写,无需按顺序操作(类似数组索引)。
缓冲机制
内核会为块设备提供缓冲区(Buffer)或缓存(Cache),用于暂存数据以提高读写效率。例如,硬盘的读写操作会先经过文件系统的块缓冲区。
典型设备
存储设备:硬盘(HDD/SSD)、U盘、光盘(CD/DVD)、SD卡等。
虚拟存储 ...
中断
Linux中中断在linux在中,嵌套中断被被禁止。回顾:单片机中,嵌套中断是当前中断发生时,被优先级更高的中断打断,优先执行级别更高的中断。
由于Linux的异步I/O、进程调度等很多重要操作都依赖于中断,中断对于内核的运行非常重要,在屏蔽中断期间所有的中断都无法得到处理,因此长时间屏蔽中断是很危险的,这有可能造成数据丢失乃至系统崩溃等后果。这就要求在屏蔽了中断之后,当前的内核执行路径应当尽快地执行完临界区的代码。
向量表中保存了一系列的跳转指令,当系统发生异常时,由处理器负责将程序执行流转到向量表中的跳转指令,最常见的就是中断向量,应用工程师只需要使用固定的函数名编写中断处理程序,在中断发生时该中断处理程序就会被自动调用,这背后的实现就是中断向量表的功劳。
在 armv7 中,中断向量表可以设置在两个地址:0x00000000 和 0xffff0000,由协处理器 cp15 的 SCTLR 的 bit13 来控制,默认情况下,中断向量表的位置在 0x00000000,实际上,对于操作系统而言,比如 linux,会更倾向于将中断向量表放在 0xffff0000 处,因为 0 ...








