• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2025-03-18 18:07 Aet 隐藏边栏 |   抢沙发  5 
文章评分 1 次,平均分 5.0

Windows

Mutex

  1. 创建或打开Mutex

  1. 等待获取Mutex所有权
    1. 通过WaitForSingleObject阻塞当前线程,直到Mutex变为有信号(可获取)状态:

  1. 释放Mutex

  1. 关闭句柄
    1. 使用CloseHandle关闭Mutex句柄(系统在进程退出时自动关闭,但显式关闭更安全):

C++

std::mutex内部实现

  1. 源码

  1. 基类

  1. 再看这个_Mtx_internal_imp_t

  1. 再看_Stl_critical_section

std::mutex实现解析

  1. 基类的核心成员 _Mtx_storage(类型为 _Mtx_internal_imp_t)包含以下字段:
    1. _Critical_section:通过 _Stl_critical_section 实现,实际指向 SRWSlim Reader/Writer)锁
    2. _Thread_id:记录当前持有锁的线程 ID
    3. _Count:递归锁计数(仅在递归互斥量中使用)
    4. _Type:锁类型标识(例如是否支持递归)
  2. _Stl_critical_section 的实质
    1. 该结构体中的 _M_srw_lock 字段(类型为 _Smtx_t,即 void*)在 Windows 平台下指向的是 SRW 锁对象
    2. SRW 锁是 Windows 提供的用户态轻量级锁,无需通过内核对象实现

STL

顺序容器

  1. array
    1. 固定大小数组,内存连续,编译时确定容量
    2. 替代原生数组的封装版,支持STL算法
  2. vector
    1. 动态数组,内存连续,支持快速随机访问(O(1)
    2. 尾部插入/删除高效,中间插入需移动元素(O(n)
  3. list
    1. 双向链表,内存非连续,任意位置插入/删除高效(O(1)
    2. 不支持随机访问,遍历效率低
  4. forward_list
    1. 单向链表,仅支持前向迭代
  5. deque
    1. 双端队列,分段连续内存,支持两端高效插入/删除(O(1)
    2. 随机访问效率接近vector,但内存消耗略高

关联容器

  1. 基于红黑树实现,元素按键值自动排序,提供对数时间复杂度的查找(O(log n)

  2. set

    1. 唯一键值集合,自动去重
  3. map

    1. 键值对集合,键唯一
  4. multiset

    1. 允许键重复的变体
  5. multimap

    1. 允许键重复的变体

无序关联容器

  1. 基于哈希表实现(C++11引入),元素无序存储,平均常数时间复杂度(O(1))
  2. unordered_set/unordered_map
    1. 哈希表实现的集合和键值对
  3. unordered_multiset/unordered_multimap
    1. 允许键重复的变体

容器适配器

  1. 基于其他容器封装,提供特定接口:
  2. stack
    1. 后进先出(LIFO),默认基于deque实现
  3. queue
    1. 先进先出(FIFO),默认基于deque实现
  4. priority_queue
    1. 优先队列,默认基于vector+堆算法实现

Windbg

dds

  1. 用于显示指定内存范围内的数据,并尝试将每个双字(4字节)解析为符号(如函数名、变量名等),从而辅助调试人员快速理解内存内容的语义

对比其他

  1. dd
    1. 仅显示双字数值,无符号解析
  2. dps
    1. 按指针大小(32位系统为4字节,64位为8字节)解析符号,适用于指针数组
  3. dqs
    1. 8字节(四字)解析符号,常用于64位环境
  4. dds
    1. 独特之处在于固定按4字节解析符号,适合分析32位代码或结构体中的双字字段(如函数表、虚表)

寄存器

C++11

C++20特性

模块(Modules

  1. 功能:替代传统头文件,解决编译速度慢和命名污染问题
    1. 模块通过 .cppm 文件定义接口,提供更清晰的代码组织方式
  2. 优势:减少编译时间,增强封装性,避免重复包含问题

协程(Coroutines

  1. 功能:支持函数暂停与恢复,简化异步编程和生成器模式
    1. 使用 co_awaitco_yieldco_return 关键字
  2. 应用场景:异步 I/O、事件驱动编程

范围库(Ranges

  1. 功能:提供链式操作和惰性求值,简化集合处理
  2. 优势:支持管道操作符(),无需中间容器

概念(Concepts

  1. 功能:约束模板参数,提升代码可读性和错误提示
  2. 应用:限制模板类型,避免隐式错误

三路比较运算符

  1. 功能:简化比较操作,自动生成 <>== 等运算符
  2. 返回值:std::strong_ordering 类型,明确比较结果

格式化库(std::format

  1. 功能:类型安全的字符串格式化,类似 Pythonstr.format
  2. 优势:替代 printfiostream,避免类型错误

std::span

  1. 提供连续内存的轻量级视图,如数组或容器片段,无需拷贝数据
  2. 示例:原生数组

  1. vector

  1. std::array

  1. 子范围操作(切片)

  1. 作为函数参数

  1. 动态修改底层数据

  1. 边界安全访问

std::jthread

  1. 自动管理线程生命周期,支持停止令牌(stop_token),避免资源泄漏

constexpr 增强

  1. 支持动态内存分配、虚函数和异常处理,如:

Lambda 改进

  1. 支持模板参数:auto lambda = []<typename T>(T x) { ... };
  2. 初始化捕获:[value = std::move(obj)]{};

char8_t 类型

  1. 明确表示 UTF-8 字符,增强编码安全性
    1. char8_t 是与 charchar16_tchar32_t 完全不同的独立类型,但其底层表示与 unsigned char 一致(至少 8 位,可能更大)
  2. 区分普通字符(依赖本地编码)与 UTF-8 字符,避免编码混淆

C++23特性

错误处理的现代化:std::expected

  1. C++23 通过 std::expected<T, E> 类型提供了更优雅的错误处理方案,替代传统的错误码或异常机制
  2. 功能:封装可能成功或失败的操作结果,成功时返回类型 T 的值,失败时携带类型 E 的错误信息
  3. 优势:类型安全、代码可读性强、性能优于异常机制

多维数据处理:std::mdspan

  1. 作为 std::span 的多维扩展,std::mdspan 支持非拥有的多维数组视图,适用于科学计算和图像处理等场景
  2. 功能:动态表示多维数据(如矩阵),支持任意维度

显式 this 参数(Deducing This

  1. 引入显式 this 参数语法,统一成员函数的左值和右值版本,简化模板代码
  2. 功能:通过 this 参数显式声明对象实例,增强代码清晰度

编译时计算的增强

  1. constexpr 支持 try-catch
    1. 允许在编译时处理异常,扩展了常量表达式的应用场景:

  1. if consteval 指令
    1. 检测当前上下文是否为编译时求值,优化代码路径:

格式化输出的简化

  1. 新增 std::printstd::println,提供类型安全的格式化输出,取代繁琐的 printfiostream
  2. 支持 {} 占位符,自动推导类型

范围库(Ranges)增强

  1. C++23 扩展了 std::ranges 的功能,新增算法和视图(如 zipchunk_by),支持更简洁的集合操作:

协程优化

  1. 增强协程的灵活性和性能,支持更高效的异步编程

std::generator

  1. 简化惰性序列生成器的实现:

std::byteswap

  1. 快速反转字节顺序,适用于网络通信和数据序列化:

std::to_underlying

  1. 将枚举转换为底层类型:

JavaScript

概述

  1. JavaScript 的主线程是单线程的,即同一时间只能执行一个任务
    1. 这种设计最初是为了避免多线程操作 DOM 导致的同步问题(如同时修改和删除元素时无法确定执行顺序)

同步与异步分工

  1. 同步代码:
    1. 直接在主线程的调用栈中执行(如变量声明、循环、函数调用)
  2. 异步代码:
    1. 通过事件循环(Event Loop) 调度,委托给浏览器/Node.js 的其他线程处理(如定时器、网络请求),完成后回调加入任务队列等待主线程空闲时执行

事件循环的运行流程

  1. 主线程执行同步任务,遇到异步任务时注册回调到 Web API(如 setTimeout 由定时器线程处理)
  2. 异步任务完成后,回调被分类到宏任务队列(如 setTimeout)或微任务队列(如 Promise.then
  3. 主线程清空同步任务后,优先执行所有微任务,再执行一个宏任务,循环往复

多线程协作

  1. Web Worker 的多线程支持
    1. 后台线程:可通过 new Worker() 创建独立线程处理 CPU 密集型任务(如大数据计算),但无法直接操作 DOM,需通过消息传递与主线程通信
    2. 线程隔离性:Worker 线程与主线程不共享内存,避免数据竞争问题
  2. 浏览器多线程协作
    1. 渲染线程、网络线程等:虽然 JavaScript 主线程是单线程,但浏览器会启动其他线程辅助渲染、网络请求等(如 CSS 解析、图片加载),最终通过事件循环与主线程交互

实践中的解决方案

  1. 异步编程范式
    1. Promise/async-await:替代回调地狱,提升代码可读性
    2. 任务分片:将大任务拆解为多个微任务,通过 requestIdleCallback 调度执行
  2. 示例:基础 Promise 示例
    1. 模拟一个异步获取用户数据的 Promise,包含成功和失败场景:

  1. 示例:async/await 改造
    1. 将上述 Promiseasync/await 重构,并添加错误处理:

  1. 示例:并行异步操作
    1. 使用 Promise.allasync/await 处理多个并发请求

  1. 示例:链式异步操作
    1. 展示 async/await 如何替代 Promise 链式调用

  1. 性能优化策略
    1. Web Worker 分流计算:将耗时任务(如视频解码)迁移到后台线程
    2. 虚拟化渲染:对长列表使用虚拟滚动技术,减少 DOM 操作压力

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享