通过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. ROS的安装和卸载

    Robot Operating System (ROS) 是一个得到广泛应用机器人系统的软件框架,它包含了一系列的软件库和工具用于构建机器人应用.从驱动到最先进的算法,以及强大的开发者工具,ROS 包 ...

  2. java ----> 基础之位运算

    package test.ant; import java.util.Arrays; import java.io.UnsupportedEncodingException; public class ...

  3. every day a practice —— morning(5)

    Huawei has not been accused of wrongdoing. As an administrative subpoena, the Treasury document does ...

  4. Vue.js表单校验;动画指令;避免内存泄露。

    Vue.js表单校验: 动画指令:创建自定义的滚动指令. 避免内存泄露. 避免内存泄露 在单页面应用开发时SPA,用户无需刷新浏览器.所以javascript应用需要自行清理组件来防止内存占用不断增长 ...

  5. 以太坊 web3.js 文档翻译及说明

    这些天,为了录制以太坊DAPP开发实战课程,我准备把web3文档全部翻译一下(并做适当的补充),目前web3.js 0.20.x 版本 已经翻译完成,欢迎大家前往查阅. 这里还几个实用DEMO,供大家 ...

  6. android------基础面试题

    1. Android的四大组件是哪些,它们的作用? 答:Activity:Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各界面的状态,做很多持 ...

  7. SQL 2016安装

    微软数据库SQL Server 2016正式版在2016年6月就发布,由于近期工作忙,一直拖到现在才有时间把安装过程写到博客上,分享给大家.本人一直习惯使用英文版,所以版本和截图都是英文版的.废话少说 ...

  8. 在线linux 平台

    1.http://www.shiyanlou.com/[实验楼] 2.http://bellard.org/jslinux/[大牛平台]

  9. dp练习2

    1, CF 808G Anthem of Berland 2, CF 741B Arpa's weak amphitheater and Mehrdad's valuable Hoses

  10. 一篇文章一张思维导图看懂Android学习最佳路线(转载)

    Android学习路线从4个阶段来对Android的学习过程做一个全面的分析:Android初级.中级.高级以及资深工程师.只针对Android应用开发,不针对Rom开发和逆向工程等.方便起见虚拟“小 ...