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

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

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

  

 #include <ntifs.h>

 typedef struct _ITEM_ {
ULONG ItemData;
LIST_ENTRY ItemEntry;
}ITEM, *PITEM; VOID SeCreateAtomLock();
VOID RemoveThreadProcedure(PVOID ParameterData);
VOID InsertThreadProcedure(PVOID ParameterData);
VOID DriverUnload(PDRIVER_OBJECT DriverObject); //bp KAtomLock!DriverEntry
LIST_ENTRY __ListHead;
KSPIN_LOCK __SpinLock;
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegisterPath)
{
NTSTATUS Status = STATUS_SUCCESS;
PDEVICE_OBJECT DeviceObject = NULL; DriverObject->DriverUnload = DriverUnload; //初始化链表
InitializeListHead(&__ListHead);
KeInitializeSpinLock(&__SpinLock);
SeCreateAtomLock(); while (!IsListEmpty(&__ListHead))
{
PLIST_ENTRY ListEntry = RemoveTailList(&__ListHead);
PITEM v1 = CONTAINING_RECORD(ListEntry,
ITEM,
ItemEntry);
KdPrint(("%d\n",v1->ItemData));
ExFreePool(v1);
}
return Status;
}
VOID SeCreateAtomLock()
{
HANDLE ThreadHandle[] = { };
ULONG i = ;
PVOID ThreadObject[] = { };
PsCreateSystemThread(&ThreadHandle[], , NULL, NULL, NULL, InsertThreadProcedure,NULL);
PsCreateSystemThread(&ThreadHandle[], , NULL, NULL, NULL, RemoveThreadProcedure,NULL);
for (i = ; i < ; i++)
{
ObReferenceObjectByHandle(ThreadHandle[i], , NULL, KernelMode, &ThreadObject[i], NULL);
}
KeWaitForMultipleObjects(, ThreadObject, WaitAll, Executive, KernelMode, FALSE, NULL, NULL);
for (i = ; i < ; i++)
{
ObDereferenceObject(ThreadObject[i]);
ZwClose(ThreadHandle[i]);
ThreadHandle[i] = NULL;
}
}
VOID DriverUnload(PDRIVER_OBJECT DriverObject)
{
DbgPrint("DriverUnload()\r\n");
} VOID InsertThreadProcedure(PVOID ParameterData)
{
PITEM Item;
int Count = ; for (Count = ; Count <= ; Count += )
{
DbgPrint("InsertThreadProcedure()\r\n");
Item = (PITEM)
ExAllocatePool(PagedPool, sizeof(ITEM)); //分页内存
Item->ItemData = Count;
//ExInterlockedInsertTailList 插入双向链表互锁操作
ExInterlockedInsertHeadList(&__ListHead, &Item->ItemEntry,&__SpinLock);
}
PsTerminateSystemThread(STATUS_SUCCESS); } VOID RemoveThreadProcedure(PVOID ParameterData)
{ int Count = ;
for (Count = ; Count <= ; Count += )
{
DbgPrint("RemoveThreadProcedure()\r\n");
PLIST_ENTRY ListEntry = ExInterlockedRemoveHeadList(&__ListHead,&__SpinLock);
PITEM v1 = CONTAINING_RECORD(ListEntry,
ITEM,
ItemEntry);
ExFreePool(v1);
}
PsTerminateSystemThread(STATUS_SUCCESS); }

  

spin lock自旋锁 双链表操作(多线程安全)(Ring0)的更多相关文章

  1. 多目标遗传算法 ------ NSGA-II (部分源码解析)辅助变量 双链表操作 list.c

    /* A custom doubly linked list implemenation */ # include <stdio.h> # include <stdlib.h> ...

  2. Synchronized和Lock, 以及自旋锁 Spin Lock, Ticket Spin Lock, MCS Spin Lock, CLH Spin Lock

    Synchronized和Lock synchronized是一个关键字, Lock是一个接口, 对应有多种实现. 使用synchronized进行同步和使用Lock进行同步的区别 使用synchro ...

  3. 自旋锁Spin lock与互斥锁Mutex的区别

    POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套常用的API.线程同步(Thread Synchronization)是并行编程中非常重要的通讯手段,其中最典型的应用 ...

  4. APUE学习笔记——11 线程同步、互斥锁、自旋锁、条件变量

    线程同步     同属于一个进程的不同线程是共享内存的,因而在执行过程中需要考虑数据的一致性.     假设:进程有一变量i=0,线程A执行i++,线程B执行i++,那么最终i的取值是多少呢?似乎一定 ...

  5. 自旋锁(Spin Lock)

    转载请您注明出处:    http://www.cnblogs.com/lsh123/p/7400625.html 0x01 自旋锁简介 自旋锁也是一种同步机制,它能保证某个资源只能被一个线程所拥有, ...

  6. Optimistic concurrency control 死锁 悲观锁 乐观锁 自旋锁

    Optimistic concurrency control https://en.wikipedia.org/wiki/Optimistic_concurrency_control Optimist ...

  7. 【APUE】信号量、互斥体和自旋锁

    http://www.cnblogs.com/biyeymyhjob/archive/2012/07/21/2602015.html http://blog.chinaunix.net/uid-205 ...

  8. Linux内核的同步机制---自旋锁

    自旋锁的思考:http://bbs.chinaunix.net/thread-2333160-1-1.html 近期在看宋宝华的<设备驱动开发具体解释>第二版.看到自旋锁的部分,有些疑惑. ...

  9. 转:自旋锁(spinlock)

    自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名. 由于 ...

随机推荐

  1. Can't push you anymore...

    为什么我们不趁着年轻去冒险? 等我们准备好,也许都已经被生活冲淡了激情. Go to different places,to meet different people. To try, to fin ...

  2. exam_review to M1

    1. 情态动词,尤其是can/can’t,should/shouldn’t. for example: You should have washed the wound.你应该已经洗好了伤口 Well ...

  3. java学习进度

    上周日玩的比较high,忘记写进度报告,今天补上.通过这些天的学习,我对java有了初步的认识,java和c有很多的不同和相同之处,然后就是java的代码在记事本里写,等慢慢深入之后又可以用eclip ...

  4. Vue.js示例:树型视图; 模式组件;

    树型图 本示例是一个简单的树形视图实现,它展现了组件的递归使用. mycode pen:https://codepen.io/chentianwei411/pen/KGKQxE 重点:递归是如何形成的 ...

  5. Spring Batch 介绍

    在企业应用的关键环境中,通常有需要很多应用来来处理大量的应用.这商业操作包括了自动化,并且负责的处理程序来对大量数据进行高效的处理,通常这些程序不需要人工进行干预.这些事件包括有基于时间周期产生的操作 ...

  6. 03 爬虫之selenium模块

    selenium模块 1.概念,了解selenium 什么是selenium?selenium是Python的一个第三方库,对外提供的接口可以操作浏览器,然后让浏览器完成自动化的操作. seleniu ...

  7. https请求排错过程

    1. 看请求有没有到nginx 此时需要查看nginx的日志.一般每一个项目都会配置一个nginx站点,而一个站点都会又一个nginx配置文件,这个文件位于哪里呢?不出意外应该在:下面,如果找不到的话 ...

  8. 121. Best Time to Buy and Sell Stock 买卖股票的最佳时机

    网址:https://leetcode.com/problems/Best-Time-to-Buy-and-Sell-Stock/ 第一想法是滑动窗口法,稍微尝试后发现不可行,至少我不会... 而后想 ...

  9. PostgreSQL主备流复制机制

    原文出处 http://mysql.taobao.org/monthly/2015/10/04/ PostgreSQL在9.0之后引入了主备流复制机制,通过流复制,备库不断的从主库同步相应的数据,并在 ...

  10. SQL SERVER版本补丁体系及升级

    首先了解几个定义: RTM : 表示 Release to Manufacturing ,这是产品的原始发布版本,当从光盘或 MSDN 下载的默认版本.不过现在下载 SQL Server 版本时,也有 ...