什么是自旋锁?

自旋锁就是一种防止多线程操作同一资源不安全行为的保护机制,在上锁到解锁会经历中断级别的提升与降低,最后总结一句话就是一次只能有一个线程进入临界区

自旋锁从上锁到解锁的时间越短,那么他的存在意义便更大,因为自旋锁会屏蔽中断,所有的其他线程都处于一个盲等的状态

注意:只有所有的线程都使用一个锁,那么这个锁才有意义,如果在堆中(局部变量)中初始化一个锁,那每次调用这个线程都会初始化一个锁就没有意义了

  1. #include <ntddk.h>
  2. #define MEM_TAG 10111
  3. //此案例中用了单线程来模拟,所以可能会使得效果自旋锁的效果不佳,但是只要懂了原理就可以了
  4. ULONG test = 0;
  5. //定义自旋锁
  6. KSPIN_LOCK mylock;
  7. //创建中断级保存对象
  8. KIRQL kIral;
  9. VOID UnloadDriver(PDRIVER_OBJECT pDriver)
  10. {
  11. DbgPrint("卸载成功\n");
  12. }
  13. VOID KSLOCK()
  14. {
  15. //初始化自旋锁
  16. KeInitializeSpinLock(&mylock);
  17. //开启自旋锁
  18. KeAcquireSpinLock(&mylock, &kIral);
  19. test = 99;
  20. DbgPrint("此时的test只能由我来操作");
  21. //关闭自旋锁并且恢复中断级
  22. KeReleaseSpinLock(&mylock, kIral);
  23. }
  24. NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pRegpath)
  25. {
  26. KSLOCK();
  27. pDriver->DriverUnload = UnloadDriver;
  28. return STATUS_SUCCESS;
  29. }