spin lock自旋锁 双链表操作(多线程安全)(Ring0)
通过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)的更多相关文章
- 多目标遗传算法 ------ NSGA-II (部分源码解析)辅助变量 双链表操作 list.c
/* A custom doubly linked list implemenation */ # include <stdio.h> # include <stdlib.h> ...
- Synchronized和Lock, 以及自旋锁 Spin Lock, Ticket Spin Lock, MCS Spin Lock, CLH Spin Lock
Synchronized和Lock synchronized是一个关键字, Lock是一个接口, 对应有多种实现. 使用synchronized进行同步和使用Lock进行同步的区别 使用synchro ...
- 自旋锁Spin lock与互斥锁Mutex的区别
POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套常用的API.线程同步(Thread Synchronization)是并行编程中非常重要的通讯手段,其中最典型的应用 ...
- APUE学习笔记——11 线程同步、互斥锁、自旋锁、条件变量
线程同步 同属于一个进程的不同线程是共享内存的,因而在执行过程中需要考虑数据的一致性. 假设:进程有一变量i=0,线程A执行i++,线程B执行i++,那么最终i的取值是多少呢?似乎一定 ...
- 自旋锁(Spin Lock)
转载请您注明出处: http://www.cnblogs.com/lsh123/p/7400625.html 0x01 自旋锁简介 自旋锁也是一种同步机制,它能保证某个资源只能被一个线程所拥有, ...
- Optimistic concurrency control 死锁 悲观锁 乐观锁 自旋锁
Optimistic concurrency control https://en.wikipedia.org/wiki/Optimistic_concurrency_control Optimist ...
- 【APUE】信号量、互斥体和自旋锁
http://www.cnblogs.com/biyeymyhjob/archive/2012/07/21/2602015.html http://blog.chinaunix.net/uid-205 ...
- Linux内核的同步机制---自旋锁
自旋锁的思考:http://bbs.chinaunix.net/thread-2333160-1-1.html 近期在看宋宝华的<设备驱动开发具体解释>第二版.看到自旋锁的部分,有些疑惑. ...
- 转:自旋锁(spinlock)
自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名. 由于 ...
随机推荐
- one-class logistic regression (OCLR)
ONE-CLASS DETECTION OF CELL STATES IN TUMOR SUBTYPES Machine Learning Identifies Stemness Features A ...
- LeetCode--007--整数反转(java)
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出 ...
- ActionCable的部署(参考Gorails)
Gorails视频 https://gorails.com/deploy/actioncable Action Cable – Integrated WebSockets for Rails http ...
- Android开源框架源码分析:Okhttp
一 请求与响应流程 1.1 请求的封装 1.2 请求的发送 1.3 请求的调度 二 拦截器 2.1 RetryAndFollowUpInterceptor 2.2 BridgeInterceptor ...
- python记录_day18 反射 判断函数与方法
一.三个内置函数 1.issubclass(a, b) 判断a类是否是b类的子类 class Foo: pass class Zi(Foo): pass class Sun(Zi): pass pr ...
- swf 上传
推荐这个博客:http://blog.csdn.net/hi_kevin/article/details/23430345 这个文章很不错,我推荐这个文章:http://leeon.me/upload ...
- leetcode-algorithms-33 Search in Rotated Sorted Array
leetcode-algorithms-33 Search in Rotated Sorted Array Suppose an array sorted in ascending order is ...
- TCP如何保证可靠性
如何保证可靠性? 1.校验和.在TCP的首部中有一个占据16为的空间用来放置校验和的结果. 这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化.如果收到段的检验和有差错,TCP将丢弃这个报文 ...
- 移除input框type="number"在部分浏览器的默认上下按钮
input::-webkit-outer-spin-button, input::-webkit-inner-spin-button { -webkit-appearance: none !impor ...
- PAT 1013 Battle Over Cities
1013 Battle Over Cities (25 分) It is vitally important to have all the cities connected by highway ...