通过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. springBoot springSecurty: x-frame-options deny禁止iframe调用

    springBoot springSecurty:  x-frame-options deny禁止iframe调用 https://blog.csdn.net/whiteforever/article ...

  2. OSPF - 1,基础

    1,OSPF知识点a)在OSPF中,如果是环回口宣告进OSPF,不管宣告时配置的是多少位掩码,路由器收到的都是32位.(EIGRP配了多少位就收到多少位).好处:EIGRP中,在PING包发起时如果在 ...

  3. Node版本管理nvm, npm

    nvm(node version manger) Node版本管理 nvm是一个简单的bash script来管理多个活动的node.js版本. 安装nvm: 具体看git:https://githu ...

  4. 2.4 UML类图

    类图定义 类class的定义 具有相同属性.操作.方法.关系或者行为的一组对象的描述符 类是真实世界事物的抽象 问题领域的类:在对系统建模时,将会涉及到如何识别业务系统中的事物,这些事物构 成了整个业 ...

  5. Remove Duplicate Letters(Java 递归与非递归)

    题目介绍: Given a string which contains only lowercase letters, remove duplicate letters so that every l ...

  6. mybatis中的mapper接口文件以及selectByExample类的实例函数详解

    记录分为两个部分,第一部分主要关注selectByExample类的实例函数的实现:第二部分讨论Mybatis框架下基本的实例函数. (一)selectByExample类的实例函数的实现 当你启动项 ...

  7. linux创建定时任务,定时执行sql

    终于弄清楚一个问题了.linux创建定时任务,定时执行sql,其中分为两个case. case-1 sql语句较少,因此直接在 shell脚本中 写sql语句.如下: [oracle@Oracle11 ...

  8. Leetcode 145

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...

  9. [CodeForces - 197B] B - Limit

    B - Limit You are given two polynomials: P(x) = a0·xn + a1·xn - 1 + ... + an - 1·x + an and Q(x) = b ...

  10. NOIP2012国王游戏(60分题解)

    题目描述 恰逢 H国国庆,国王邀请n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最前面 ...