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

函数

InterlockedIncrement

  1. 概述
    1. 这两个函数是 Windows 平台上进行线程安全原子操作的核心工具,用于实现高效的无锁多线程编程
  2. 特性
    1. 原子性:CPU 硬件保证操作的不可分割性
    2. 无锁:无需传统互斥锁(mutex),性能更高
    3. 内存屏障:隐含完整的读-写内存屏障语义
    4. 返回值:返回操作后的新值

InterlockedExchange

  1. 概述

    1. 完全原子操作 的核心 Windows API,专为多线程环境下的变量同步设计
    2. 通过 CPU 指令 XCHGExchange)实现
    3. 执行期间锁定内存总线,阻止其他核心访问目标内存
  2. 与锁(Mutex)的区别:

特性 InterlockedExchange 互斥锁(Mutex
阻塞其他线程 ❌ (单指令完成) ✔️ (等待锁释放)
开销 ~10 ns ~100 ns (上下文切换)
适用场景 简单变量操作 复杂代码段保护
  1. 特性

    1. 线程安全:修改 LONG (32位) 时绝对原子
    2. 返回原始值:返回操作前的变量值(非写入值!)
  2. 示例1:g_lCheckThradRuning

    1. 类型应为LONG32位有符号整型)

    2. 通常声明为全局变量:volatile LONG g_lCheckThradRuning = 0;

  1. 示例2:开关标志位控制

  1. 示例3:轻量级自旋锁

  1. 示例4:内存屏障作用
    1. 隐式包含 编译器屏障:阻止指令重排
    2. 强制内存操作顺序:

VirtualAlloc

  1. 参数
    1. 直接操作虚拟内存管理器

  1. 特性
    1. 页粒度分配:默认 4KB (x86/x64)
    2. 零开销控制:无堆管理元数据
  2. 内存保留和提交
    1. MEM_RESERVE:预留虚拟地址范围(无物理存储)
    2. MEM_COMMIT:分配物理页/页面文件空间

  1. 内存保护控制
权限类型 用途
PAGE_READONLY 防意外写入的安全内存区
PAGE_EXECUTE_READ 可执行代码区(动态代码生成)
PAGE_GUARD 创建警戒页(堆栈自动扩展)
PAGE_NOACCESS 故意触发访问异常的防护区域
  1. 高级操作

  1. 场景
    1. 超大内存分配
    2. 自定义内存池
    3. 安全敏感操作
    4. 内存映射文件基址

VirtualAlloc对比malloc

特性 VirtualAlloc malloc
操作系统层级 Windows 内核级 API C/C++ 运行库函数
内存来源 虚拟内存管理器 (直接操作页表) 进程堆管理器 (CRT 堆)
分配单位 内存页 (4KB/2MB/1GB) 字节 (最小对齐 16 字节)
分配开销 200ns (直接系统调用) 50-100ns (用户态管理器)
管理粒度 开发者完全控制 CRT 自动管理
内存扩展 需显式提交/释放 自动增长堆空间
地址对齐 按页对齐 8/16 字节对齐 (x86/x64)
元数据开销 0 字节 16-32 字节/块 (跟踪信息)
大内存支持 支持 TB 级分配 最大通常为 1-2GB (调试堆限制)
内存类型 可分配物理内存/页面文件/大页 仅用户态普通内存
错误处理 GetLastError() 详细代码 返回 NULL (有限错误信息)

QueryPerformanceCounter

  1. 介绍
    1. 获取当前高性能计时器的计数值
    2. 数值会随着时间线性增加
  2. 返回值
    1. TRUE:成功获取计数值
    2. FALSE:失败(与 QueryPerformanceFrequency 一致)
  3. 特点
    1. 单调递增:值只增不减,不受系统时间调整影响
    2. 极高分辨率:现代系统提供 100 纳秒级精度
    3. CPU 时钟源:通常基于 CPUTSC (Time Stamp Counter)
  4. 示例

QueryPerformanceFrequency

  1. 介绍
    1. 获取高性能计时器的频率(分辨率)
    2. 返回计时器的 计数值/秒(赫兹 Hz
    3. 只需调用一次(系统启动后频率固定)
  2. 返回值
    1. TRUE:系统支持高性能计时器
    2. FALSE:系统不支持(较老的 486 或早期奔腾处理器)
  3. 示例1

  1. 示例2

SetThreadPriority

  1. 概述
    1. 更改指定线程在系统调度器中的相对优先级,影响其获取CPU时间片的概率和频率

  1. nPriority
优先级常量 作用描述 典型应用场景 ⚠️ 注意事项
THREAD_PRIORITY_IDLE -15 最低优先级:线程只在系统完全空闲时才运行(1%以下CPU负载)。 - 后台监控线程 - 系统级监视器 - 极低优先级日志 线程可能导致饥饿
THREAD_PRIORITY_LOWEST -2 最低可调度级:优先级大幅降低,但比IDLE更容易获得CPU时间。 - 文件后台下载 - 资源消耗型计算(不影响UI
THREAD_PRIORITY_BELOW_NORMAL -1 略低于正常:稍低于进程默认优先级。 - 辅助处理线程 - 次要数据同步
THREAD_PRIORITY_NORMAL 0 默认级别:继承进程优先级(通常是NORMAL_PRIORITY_CLASS)。 - 大多数常规线程 - UI线程(需更高优先级) 默认值
THREAD_PRIORITY_ABOVE_NORMAL +1 略高于正常:比进程优先级略高。 - 重要后台任务 - 即时响应型计算(非实时)
THREAD_PRIORITY_HIGHEST +2 最高可调度级:显著提升优先级(在进程优先级范围内)。 - 关键数据采集线程 - 音频视频处理核心 - 网络实时响应
THREAD_PRIORITY_TIME_CRITICAL 15 时间关键级:设置线程到其优先级类别的最高绝对优先级 - 硬件中断处理 - 实时控制系统 - 核心系统服务线程 ⚠️可能导致其他线程饥饿系统不稳定

C++23

std::unique_resource

  1. 概述
    1. 用于实现类型安全、通用的资源管理
  2. 设计

  1. 特点
    1. 资源+删除器绑定:将资源对象与清理操作封装为单一实体
    2. 零开销抽象:编译器优化后性能媲美手动管理
    3. 异常安全保证:资源泄漏不可能的最终防线
  2. 功能

  1. 进阶技巧

  1. 异常处理机制

其他

一种延迟执行方法

  1. 非线程安全设计(应避免跨线程使用)
  2. std::unique_resource

优先级工作机制 (调度器视角)

  1. 概述
    1. 续上节SetThreadPriority
  2. 基础优先级计算:
    1. 例:若进程优先级为 NORMAL_PRIORITY_CLASS(基础值8),线程设置 THREAD_PRIORITY_HIGHEST(+2),则最终调度优先级 = 10.

  1. Windows优先级范围表 (0-31):
    1. THREAD_PRIORITY_IDLE:强制线程优先级到0(系统空闲进程级),无论进程优先级多高
    2. THREAD_PRIORITY_TIME_CRITICAL:强制线程优先级到31(硬件中断级)

  1. 调度策略:
    1. 高优先级线程可抢占低优先级线程的CPU时间片
    2. 同级线程按时间片轮转调度(约10-15ms/次)

THREAD_PRIORITY_IDLE 深度分析

  1. 概述
    1. 续上节SetThreadPriority

  1. 具体行为
    1. 强制线程基础优先级为0(系统最低级)
    2. 调度策略:
      其他所有优先级 > 0 的线程运行完毕后才考虑该线程
      即使进程优先级设为 HIGH_PRIORITY_CLASS(13)也无效
  2. 场景

  1. 风险

THREAD_PRIORITY_TIME_CRITICAL 注意事项

  1. 概述
    1. 续上节SetThreadPriority
  2. 使用原则

线程优先级实战选择建议

需求场景 推荐优先级 代码示例
后台日志写入 THREAD_PRIORITY_IDLE 磁盘I/O密集 + 允许延迟
用户界面渲染 THREAD_PRIORITY_ABOVE_NORMAL 保证UI流畅响应 (优先级 > 计算线程)
网络数据包处理 THREAD_PRIORITY_HIGHEST 避免数据堆积,确保实时性
硬件驱动中断服务 THREAD_PRIORITY_TIME_CRITICAL 要求μs级响应 (需严格控制执行时间)
常规数据处理 THREAD_PRIORITY_NORMAL 默认策略,无特殊要求时使用

线程优先级与I/O关系

  1. 线程优先级不直接影响磁盘或网络I/O优先级
  2. 需额外设置:

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

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

发表评论

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