Interlocked单向链式栈
线程同步一大部分与原子访问(atomic access)有关, 所谓原子访问, 指的是一个线程在访问某个资源的同时能够保证没有其他线程会在同一时刻访问同一资源.
Interlocked单向链式栈的操作函数:
InitializeSListHead,创建一个空栈
- void WINAPI InitializeSListHead(
- __inout PSLIST_HEADER ListHead//链头
- );
InterlockedPushEntrySList,在头添加,返回值为之前的第一项,如果之前为空链,则返回NULL。
PSLIST_ENTRY WINAPI InterlockedPushEntrySList(
- __inout PSLIST_HEADER ListHead,//链头
- __inout PSLIST_ENTRY ListEntry//插入项
- );
InterlockedPopEntrySList,在头取出(区别于从尾部取出),返回值就是取的那个项的指针,如果之前为空链,则返回NULL。
- PSLIST_ENTRY WINAPI InterlockedPopEntrySList(
- __inout PSLIST_HEADER ListHead
- );
InterlockedFlushSList,清空栈
- PSLIST_ENTRY WINAPI InterlockedFlushSList(
- __inout PSLIST_HEADER ListHead
- );
QueryDepthSList,返回元素的数量。
- USHORT WINAPI QueryDepthSList(
- __in PSLIST_HEADER ListHead
- );
- // ThreadSynchronization.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include <windows.h>
- #include <iostream>
- using namespace std;
- typedef struct _ITEM_ {
- ULONG ItemData;
- SINGLE_LIST_ENTRY ItemEntry;
- }ITEM,*PITEM;
- DWORD WINAPI InsertThreadProcedure(LPVOID ParameterData);
- DWORD WINAPI RemoveThreadProcedure(LPVOID ParameterData);
- SLIST_HEADER __ListHead;
- void main()
- {
- ULONG Count;
- PSINGLE_LIST_ENTRY ListEntry;
- InitializeSListHead(&__ListHead);
- HANDLE ThreadHandle[] = { };
- ThreadHandle[] = CreateThread(NULL, , (LPTHREAD_START_ROUTINE)InsertThreadProcedure, NULL, ,NULL);
- ThreadHandle[] = CreateThread(NULL, , (LPTHREAD_START_ROUTINE)RemoveThreadProcedure, NULL, ,NULL);
- WaitForMultipleObjects(, ThreadHandle, TRUE, INFINITE);
- int i = ;
- for (i=;i<;i++)
- {
- CloseHandle(ThreadHandle[i]);
- ThreadHandle[i] = NULL;
- }
- ListEntry = __ListHead.Next.Next;
- while (ListEntry != NULL)
- {
- PITEM v1 = CONTAINING_RECORD(ListEntry, ITEM, ItemEntry);
- printf("%d ", v1->ItemData);
- ListEntry = ListEntry->Next;
- }
- ListEntry = InterlockedFlushSList(&__ListHead); //全部移除
- ListEntry = InterlockedPopEntrySList(&__ListHead);
- if (ListEntry != NULL)
- {
- // Error - list is not empty.
- }
- }
- DWORD WINAPI InsertThreadProcedure(LPVOID ParameterData)
- {
- int Count = ;
- PSINGLE_LIST_ENTRY ListEntry;
- PITEM Item;
- for (Count = ; Count <= ; Count += )
- {
- Item = (PITEM)malloc(sizeof(ITEM));
- Item->ItemData = Count;
- ListEntry = InterlockedPushEntrySList(&__ListHead,
- &Item->ItemEntry);
- }
- return ;
- }
- DWORD WINAPI RemoveThreadProcedure(LPVOID ParameterData)
- {
- int Count = ;
- PSINGLE_LIST_ENTRY ListEntry;
- for (Count = ; Count <= ; Count += )
- {
- ListEntry = InterlockedPopEntrySList(&__ListHead);
- if (ListEntry == NULL)
- {
- break;
- }
- }
- return ;
- }
ThreadSynchronization.cpp
Interlocked单向链式栈的更多相关文章
- 读书笔记——Windows核心编程(8)Interlocked单向链式栈
SLists使用了无锁算法来保证原子同步,以提升系统性能,避免了诸如优先级挂和互锁的问题. 注意:所有的链表项必须对齐到MEMORY_ALLOCATION_ALIGNMENT.否则会出现奇葩的错误. ...
- 第8章 用户模式下的线程同步(1)_Interlocked系列函数
8.1 原子访问:Interlocked系列函数(Interlock英文为互锁的意思) (1)原子访问的原理 ①原子访问:指的是一线程在访问某个资源的同时,能够保证没有其他线程会在同一时刻访问该资源. ...
- 栈(链式栈)----C语言
链式栈:就是一种操作受限的单向链表,对单向链表还不了解的可先看一下之前的一篇关于单向链表的随笔,链表(单向链表的建立.删除.插入.打印),理解了单向链表后再来看链式栈就比较轻松了 链式栈的操作一般含有 ...
- Java的顺序栈和链式栈
栈的定义 栈是限制在表的一段进行插入和删除的运算的线性表,通常能够将插入.删除的一端为栈顶,例外一端称为栈底,当表中没有任何元素的时候称为空栈. 通常删除(又称"退栈")叫做弹出p ...
- java单向加密算法小结(2)--MD5哈希算法
上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...
- C#各种同步方法 lock, Monitor,Mutex, Semaphore, Interlocked, ReaderWriterLock,AutoResetEvent, ManualResetEvent
看下组织结构: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex S ...
- hibernate多对一单向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- hibernate一对一外键单向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- hibernate一对一主键单向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
随机推荐
- H264编码 封装成MP4格式 视频流 RTP封包
H264编码 封装成MP4格式 视频流 RTP封包 分类: 多媒体编程 2013-02-20 21:31 3067人阅读 ...
- 20181013xlVba年级成绩报表
Public Sub 高一成绩报表() Application.ScreenUpdating = False Application.DisplayAlerts = False Application ...
- ssh登陆报错:packet_write_wait: Connection to x.x.x.x port 22: Broken pipe
ssh登陆报错:packet_write_wait: Connection to x.x.x.x port 22: Broken pipe 参考文章: https://patrickmn.com/as ...
- Confluence 6 创建小组的公众空间
现在是我们可以开始创建公众空间的时候了,全世界都希望知道这个项目和勇敢的探险活动. 在这个步骤中,我们将会创建一个项目小组的空间,并且将这个空间公布给全世界.这个表示的是你将会让你的 Confluen ...
- python-跨域问题
跨域:因为浏览器的同源策略,在你请求返回的时候会进行拦截 jsonp 只能发 get 请求 cors 可以发任何请求 ,在响应时加个响应头就行 同源策略对ajax阻拦 同源策略对src或href属性的 ...
- Pycharm中安装package出现microsoft visual c++ 14.0 is required问题解决办法
在利用pycharm安装scrapy包是遇到了挺多的问题.在折腾了差不多折腾了两个小时之后总算是安装好了.期间各种谷歌和百度,发现所有的教程都是利用命令行窗口安装的.发现安装scrapy需要的包真是多 ...
- URL与URI的含义及区别
1.1 什么是URI? 简单点说:URI就是通用资源标志符,不理解是吧,我第一次听说也是不理解. 进一步说:网络上的一些资源(文档.图片.音频.视频.程序等)都是有一些通用资源标识(Universal ...
- WDA基础二:界面,元素介绍
1.ELEMENTS: BUTTON 按钮 CAPTION 标题 DROPDOWN_BY_IDX 带序号的下拉 DROPDOWN_BY_KEY 带键值的下拉 FILE_UPLOAD ...
- Python面向对象高级编程-__slots__、定制类,枚举
当在类体内定义好各种属性后,外部是可以随便添加属性的,Python中类如何限制实例的属性? Python自带了很多定制类,诸如__slots__,__str__ __slots__ __slots__ ...
- os模块,序列化模块,json模块,pickle模块
一.os模块os.system("bash command") 运行shell命令,直接显示 os.popen("bash command).read() 运行shell ...