Windows 单向链表(SList)同步机制详解
核心概念
SList(Singly-Linked List)是一种基于非阻塞算法实现的线程安全链表结构,具有以下特性:
- 原子性操作:所有插入/删除操作均通过硬件级原子指令完成
- 无锁设计:避免传统锁机制的优先级反转和锁定护航问题
- 高性能:特别适合高并发场景(如驱动程序、实时系统)
- 内存对齐要求:所有节点必须按MEMORY_ALLOCATION_ALIGNMENT(默认8字节)对齐
平台支持
Windows 版本 | 支持特性 |
---|
Windows XP+ | 支持32位SList操作 |
Windows 8+ | 新增64位原子操作支持(如InterlockedCompare64Exchange128) |
Windows 10+ | 优化多核处理器下的并发性能 |
关键函数清单
初始化操作
函数 | 描述 |
---|
InitializeSListHead | 初始化SList头节点,必须在使用前调用 |
插入操作
函数 | 描述 |
---|
InterlockedPushEntrySList | 原子性将节点插入链表头部 |
InterlockedPushListSList | 原子性合并两个SList(高效批量插入) |
删除操作
函数 | 描述 |
---|
InterlockedPopEntrySList | 原子性移除并返回链表头部节点 |
InterlockedFlushSList | 清空链表并返回所有节点(适用于批量处理) |
查询操作
函数 | 描述 |
---|
QueryDepthSList | 获取链表当前节点数量(近似值,非实时精确计数) |
RtlFirstEntrySList | 获取链表头部节点指针(不修改链表状态) |
内存管理规范
对齐要求
PSLIST_ENTRY pNode = (PSLIST_ENTRY)_aligned_malloc(sizeof(SLIST_ENTRY), MEMORY_ALLOCATION_ALIGNMENT);
InitializeSListHead(pNode);# 互锁的 Singly 链接列表互锁的单锁链接列表(SList)简化了从链接列表中插入和删除的任务。 SList 是使用非阻止算法实现的,可提供原子同步、提高系统性能,并避免诸如优先级反转和锁定护航等问题。SList 在 32 位代码中实现和使用非常简单。 但是,很难在 64 位代码中实现它们,因为本机互锁交换基元可交换的数据量不是地址大小的两倍,因为它位于 32 位代码中。 因此,SLists 支持将高端可缩放算法移植到 Windows。Windows 8: 从 Windows 8 开始,相应的本机互锁交换基元可用于 64 位代码,例如 InterlockedCompare64Exchange128。应用程序可以通过调用 InitializeSListHead 函数来使用 SLists 初始化列表的头。 若要在列表中插入项,请使用 InterlockedPushEntrySList 函数。 若要从列表中删除项,请使用 InterlockedPopEntrySList 函数。所有列表项都必须在 MEMORY_ALLOCATION_ALIGNMENT 边界上对齐。 未对齐的项可能会导致不可预知的结果。 请参阅 _aligned_malloc。