刘收获

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

spin lock自旋锁 双链表操作(多线程安全)(Ring0)

  通过spin lock自旋锁 ,为每个链表都定义并初始化一个锁,在需要向该链表插入或移除节点时不使用前面介绍的普通函数,而是使用如下方法:
  ExInterlockedInsertHeadList(&linkListHead, &pData->ListEntry, &spin_lock);

  //ExInterlockedInsertTailList(&linkListHead, &pData->ListEntry, &spin_lock);
  ExInterlockedRemoveHeadList(&linkListHead, &spin_lock);


  此时在向链表中插入或移除节点时会自动调用关联的锁进行加锁操作有效地保证了多线程安全性。

  

复制代码
 1 #include <ntifs.h>
 2 
 3 
 4 typedef struct _ITEM_ {
 5     ULONG ItemData;
 6     LIST_ENTRY ItemEntry;
 7 }ITEM, *PITEM;
 8 
 9 VOID SeCreateAtomLock();
10 VOID RemoveThreadProcedure(PVOID ParameterData);
11 VOID InsertThreadProcedure(PVOID ParameterData);
12 VOID DriverUnload(PDRIVER_OBJECT DriverObject);
13 
14 //bp KAtomLock!DriverEntry
15 LIST_ENTRY __ListHead;
16 KSPIN_LOCK __SpinLock;
17 NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegisterPath)
18 {
19     NTSTATUS Status = STATUS_SUCCESS;
20     PDEVICE_OBJECT  DeviceObject = NULL;
21     
22     DriverObject->DriverUnload = DriverUnload;
23 
24     //初始化链表
25     InitializeListHead(&__ListHead);
26     KeInitializeSpinLock(&__SpinLock);
27     SeCreateAtomLock();
28     
29     while (!IsListEmpty(&__ListHead))
30     {
31         PLIST_ENTRY ListEntry = RemoveTailList(&__ListHead);
32         PITEM v1 = CONTAINING_RECORD(ListEntry,
33             ITEM,
34             ItemEntry);
35         KdPrint(("%d\n",v1->ItemData));
36         ExFreePool(v1);
37     }
38     return Status;
39 }
40 VOID SeCreateAtomLock()
41 {
42     HANDLE  ThreadHandle[2] = { 0 };
43     ULONG   i = 0;
44     PVOID   ThreadObject[2] = { 0 };
45     PsCreateSystemThread(&ThreadHandle[0], 0, NULL, NULL, NULL, InsertThreadProcedure,NULL);
46     PsCreateSystemThread(&ThreadHandle[1], 0, NULL, NULL, NULL, RemoveThreadProcedure,NULL);
47     for (i = 0; i < 2; i++)
48     {
49         ObReferenceObjectByHandle(ThreadHandle[i], 0, NULL, KernelMode, &ThreadObject[i], NULL);
50     }
51     KeWaitForMultipleObjects(2, ThreadObject, WaitAll, Executive, KernelMode, FALSE, NULL, NULL);
52     for (i = 0; i < 2; i++)
53     {
54         ObDereferenceObject(ThreadObject[i]);
55         ZwClose(ThreadHandle[i]);
56         ThreadHandle[i] = NULL;
57     }
58 }
59 VOID DriverUnload(PDRIVER_OBJECT DriverObject)
60 {
61     DbgPrint("DriverUnload()\r\n");
62 }
63 
64 VOID InsertThreadProcedure(PVOID ParameterData)
65 {
66     PITEM Item;
67     int Count = 0;
68 
69     
70     for (Count = 1; Count <= 20; Count += 1)
71     {    
72         DbgPrint("InsertThreadProcedure()\r\n");
73         Item = (PITEM)
74             ExAllocatePool(PagedPool, sizeof(ITEM));   //分页内存 
75         Item->ItemData = Count;
76         //ExInterlockedInsertTailList              插入双向链表互锁操作  
77         ExInterlockedInsertHeadList(&__ListHead, &Item->ItemEntry,&__SpinLock);
78     }
79     PsTerminateSystemThread(STATUS_SUCCESS);
80 
81 }
82 
83 VOID RemoveThreadProcedure(PVOID ParameterData)
84 {
85     
86     int Count = 0;
87     for (Count = 1; Count <= 10; Count += 1)
88     {
89         DbgPrint("RemoveThreadProcedure()\r\n");
90         PLIST_ENTRY ListEntry = ExInterlockedRemoveHeadList(&__ListHead,&__SpinLock);
91         PITEM v1 = CONTAINING_RECORD(ListEntry,
92             ITEM,
93             ItemEntry);
94         ExFreePool(v1);
95     }
96     PsTerminateSystemThread(STATUS_SUCCESS);
97 
98 }
View Code
复制代码

 

  

posted on   沉疴  阅读(992)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示