这玩意本来是在Vista SP1版本就存在了,但是某些傻x客户还在坚持使用老旧的windows操作系统。可以使用下面的移植方案代替。

在微软的实现上好像有一些调试用途或者什么优化,移植不了,去掉了。

#ifndef _MY_EX_SPIN_LOCK
#define _MY_EX_SPIN_LOCKtypedef LONG    EX_SPIN_LOCK;KIRQL NTAPI ExAcquireSpinLockExclusive(volatile EX_SPIN_LOCK *ExSpinLock);
KIRQL NTAPI ExAcquireSpinLockShared(volatile EX_SPIN_LOCK *ExSpinLock);
void NTAPI ExReleaseSpinLockExclusive(EX_SPIN_LOCK *ExSpinLock, KIRQL NewIrql);
void NTAPI ExReleaseSpinLockShared(EX_SPIN_LOCK *ExSpinLock, KIRQL NewIrql);#endif // _MY_EX_SPIN_LOCK
#include <wdm.h>
#include "exspinlock.h"VOID NTAPI ExpWaitForSpinLockExclusiveAndAcquire(volatile EX_SPIN_LOCK *ExSpinLock)
{while(*ExSpinLock < 0 || _interlockedbittestandset(ExSpinLock, 0x1Fu));
}VOID NTAPI ExpWaitForSpinLockSharedAndAcquire(volatile EX_SPIN_LOCK *ExSpinLock)
{while(1){if(*ExSpinLock >= 0){EX_SPIN_LOCK Tmp = *ExSpinLock;if (_InterlockedCompareExchange(ExSpinLock, Tmp + 1, Tmp) == Tmp)break;}}
}KIRQL NTAPI ExAcquireSpinLockExclusive(volatile EX_SPIN_LOCK *ExSpinLock)
{KIRQL OldIrql;OldIrql = KfRaiseIrql(DISPATCH_LEVEL);if(_interlockedbittestandset(ExSpinLock, 0x1Fu))ExpWaitForSpinLockExclusiveAndAcquire(ExSpinLock);while(*ExSpinLock != 0x80000000);return OldIrql;
}KIRQL NTAPI ExAcquireSpinLockShared(volatile EX_SPIN_LOCK *ExSpinLock)
{KIRQL OldIrql;EX_SPIN_LOCK Tmp;OldIrql = KfRaiseIrql(DISPATCH_LEVEL);Tmp = *ExSpinLock & 0x7FFFFFFF;if(_InterlockedCompareExchange(ExSpinLock, Tmp + 1, Tmp) != Tmp ){ExpWaitForSpinLockSharedAndAcquire(ExSpinLock);}return OldIrql;
}void NTAPI ExReleaseSpinLockExclusive(EX_SPIN_LOCK *ExSpinLock, KIRQL NewIrql)
{_InterlockedAnd(ExSpinLock, 0);KeLowerIrql(NewIrql);
}void NTAPI ExReleaseSpinLockShared(EX_SPIN_LOCK *ExSpinLock, KIRQL NewIrql)
{_InterlockedExchangeAdd(ExSpinLock, 0xFFFFFFFF);KeLowerIrql(NewIrql);
}

Windows内核读写自旋锁EX_SPIN_LOCK相关推荐

  1. liunx内核中的互斥自旋锁和读写自旋锁的实现详解

    今天把这两个锁的内核实现源码重新捋了一遍,基于liunx2,6.0,直接粘注释版: 核心文件,x86下实现的spinlock #ifndef __ASM_SPINLOCK_H #define __AS ...

  2. 内核并发控制---读写自旋锁 (来自网易)

    定义在头文件linux/spinlock.h或linux/rwlock.h中; 自旋锁并不关心其锁定的临界区究竟会进行怎么样的操作,不管是读还是写,都一视同仁,即便是多个执行单元同时并发地读取临界区资 ...

  3. 读写自旋锁详解,第 2 部分(来自IBM)

    读者优先的读写自旋锁 我们先不考虑性能,搞出一个可用的实现再说.首先,用一个整型变量 status 来记录当前状态:另一个整型变量 nr_readers 来记录同时持有锁的读者数量,只有当 nr_re ...

  4. 读写自旋锁,第1部分(来自IBM)

    读写自旋锁简介 什么是读写自旋锁 由于互斥的特点,使用自旋锁的代码毫无线程并发性可言,多处理器系统的性能受到限制.通过观察线程在临界区的访问行为,我们发现有些线程只是简单地读取信息,并不修改任何东西, ...

  5. 读写自旋锁详解:TODO

    林 昊翔 2011 年 7 月 21 日发布 Table of Contents 读写自旋锁简介 什么是读写自旋锁 读写自旋锁的属性 以自动机的观点看读写自旋锁 读写自旋锁的实现细节 读写自旋锁的接口 ...

  6. [内核同步]自旋锁spin_lock、spin_lock_irq 和 spin_lock_irqsave 分析

    关于进程上下文,中断上下文,请看这篇文章 Linux进程上下文和中断上下文内核空间和用户空间 自旋锁的初衷:在短期间内进行轻量级的锁定.一个被争用的自旋锁使得请求它的线程在等待锁重新可用的期间进行自旋 ...

  7. 读写自旋锁详解,第 3 部分(来自IBM)

    基于简单共享变量的读写自旋锁的不足 本系列文章的第 2 部分中给出的实现都基于简单共享变量,简洁实用,但在大规模多核.NUMA 系统上可扩展性较差.我们说某个读写自旋锁的实现是可扩展的,通俗地讲是指在 ...

  8. linux内核自旋锁解释,LINUX内核笔记:自旋锁

    目录 1.自旋锁作用与基本使用方法? 与其他锁一样,自旋锁也用于保护临界区,但是自旋锁主要是用于在SMP上保护临界区.在SMP上,自旋锁最多只能被一个可执行线程持有,如果一个线程尝试获得一个被争用的自 ...

  9. 内核并发控制---自旋锁(来自网易)

    定义在头文件linux/spinlock.h中; 自旋锁(spin lock)是一种对临界资源进行互斥访问的典型手段;为了获得一个自旋锁,在某CPU上运行的代码需要首先执行一个原子操作,该操作测试并设 ...

最新文章

  1. 曲线学习PyQt5方案一
  2. Linux之wget下载
  3. Facebook如何向十亿人推荐东西
  4. python从入门到实践笔记_Python编程从入门到实践二至七章笔记
  5. kali linux fuzz工具集简述
  6. 部署在SAP ABAP服务器上的SAP UI5应用的JavaScript文件,是如何被SAP UI5 repository handler处理的
  7. php接收不到ios值,php设置标签后,ios收不到,安卓可以收到
  8. MySQL遭遇DELETE误操作的回滚
  9. Ehcache、memcache、redis三大缓存区别
  10. Spring基础——在 Spring Config 文件中基于 XML 的 Bean 的自动装配
  11. 怎样通过ip查看linux密码,怎么根据linux根据ip地址查主机名
  12. 兰州大学2016年初试成绩基本要求
  13. 我的微博,三层嵌套,
  14. ascll码和常用5000汉字(做字库可能会用到)
  15. H264解码过滤花屏视频帧
  16. 穿孔发光字/外露发光字制作流程步骤
  17. pip安装第三方库 报错:You should consider upgrading
  18. day027 jQuery第二天
  19. 【腾讯云原生降本增效大讲堂】云原生混部技术标准解读
  20. 外贸邮箱到底用哪个好,什么样企业邮箱更适合做外贸?

热门文章

  1. android gridview item添加checkbox,手把手教你实现GridView中Checkbox全选
  2. windows缩放200模糊_1.8M超轻量目标检测模型NanoDet,比YOLO跑得快,上线两天Star量超200...
  3. 服务器mvc提示404错误信息,解决Spring MVC提示404错误找不到JSP问题
  4. Python logging模块日志存储位置踩坑
  5. [python]函数默认参数顺序问题
  6. Python 内存分配时的小秘密
  7. 什么是rip协议其优缺点_南京课工场IT培训:常见动态路由协议之———RIP动态路由实验...
  8. php 情书,PHP好玩的代码一(笛卡尔的情书)
  9. 欢迎使用CSDN-markdown
  10. JAVA处理 M_一次Java内存泄露处理手记