线程同步一大部分与原子访问(atomic access)有关, 所谓原子访问, 指的是一个线程在访问某个资源的同时能够保证没有其他线程会在同一时刻访问同一资源.

   

  Interlocked单向链式栈的操作函数:

  InitializeSListHead,创建一个空栈

void WINAPI InitializeSListHead(
__inout PSLIST_HEADER ListHead//链头
);

  InterlockedPushEntrySList,在头添加,返回值为之前的第一项,如果之前为空链,则返回NULL。

PSLIST_ENTRY WINAPI InterlockedPushEntrySList(

  1. __inout  PSLIST_HEADER ListHead,//链头
  2. __inout  PSLIST_ENTRY ListEntry//插入项
  3. );

  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单向链式栈的更多相关文章

  1. 读书笔记——Windows核心编程(8)Interlocked单向链式栈

    SLists使用了无锁算法来保证原子同步,以提升系统性能,避免了诸如优先级挂和互锁的问题. 注意:所有的链表项必须对齐到MEMORY_ALLOCATION_ALIGNMENT.否则会出现奇葩的错误. ...

  2. 第8章 用户模式下的线程同步(1)_Interlocked系列函数

    8.1 原子访问:Interlocked系列函数(Interlock英文为互锁的意思) (1)原子访问的原理 ①原子访问:指的是一线程在访问某个资源的同时,能够保证没有其他线程会在同一时刻访问该资源. ...

  3. 栈(链式栈)----C语言

    链式栈:就是一种操作受限的单向链表,对单向链表还不了解的可先看一下之前的一篇关于单向链表的随笔,链表(单向链表的建立.删除.插入.打印),理解了单向链表后再来看链式栈就比较轻松了 链式栈的操作一般含有 ...

  4. Java的顺序栈和链式栈

    栈的定义 栈是限制在表的一段进行插入和删除的运算的线性表,通常能够将插入.删除的一端为栈顶,例外一端称为栈底,当表中没有任何元素的时候称为空栈. 通常删除(又称"退栈")叫做弹出p ...

  5. java单向加密算法小结(2)--MD5哈希算法

    上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...

  6. C#各种同步方法 lock, Monitor,Mutex, Semaphore, Interlocked, ReaderWriterLock,AutoResetEvent, ManualResetEvent

    看下组织结构: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex S ...

  7. hibernate多对一单向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  8. hibernate一对一外键单向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  9. hibernate一对一主键单向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

随机推荐

  1. Oracle DB , 计算各个用户/schema 的磁盘占用空间

    http://www.dba-oracle.com/t_find_size_schema.htm Question:  How do I find the size of a schema in my ...

  2. C语言流控制命令的总结

    C语言流控制命令的总结 基本概念: C语言中,自顶向下的的代码的流程叫做程序流. 能够改变程序流顺序的语句叫做流控制命令. 我为什么要写这篇文章 在学习C语言的过程中,经常会用到条件语句和循环语句这些 ...

  3. Tomcat ----> 学习笔记

    源码之几个常见类和接口的关系 在学习Servlet的时候经常见到以下几个合成单词和非合成单词:Servlet.GenericServlet.HttpServlet.它们之间有联系的.接下来我把它们的联 ...

  4. hdu-2709整数划分 技巧

    整数划分变形,由2^k组成. 整数划分中一个节约内存的技巧,平时我们使用dp[i][j]维护用不大于j的数组合成i的方案数,所以必须dp[i-j][j]->dp[i][j].这样就需要二位,如果 ...

  5. javascript 两张图片切换 三目运算符

    <body> <script> function changeImage(){ var s = document.getElementById('myimage'); s.sr ...

  6. 报错 hint: Updates were rejected because the remote contains work that you do 解决方法

    1. git pull origin master --allow-unrelated-histories 2.git pull origin master 3.git init 4.git remo ...

  7. Vue之单文件组件的数据传递,axios请求数据及路由router

    1.传递数据 例如,我们希望把父组件的数据传递给子组件. 可以通过props属性来进行传递. 传递数据三个步骤: 步骤1:在父组件中,调用子组件的组名处,使用属性值的方式往下传递数据 <Menu ...

  8. python记录_day019 类的约束 异常处理 日志

    一 .约束 python中约束有两种 第一种,通过抛异常进行约束,这种是子类不按我要求的来,我就给你抛异常(推荐) 操作:提取一个父类. 在父类中给出一个方法.但在方法中不给出任何代码,直接抛异常 # ...

  9. [Fiddler] ReadResponse() failed: The server did not return a complete response for this request. Server returned 0 bytes.

    待解决 [Fiddler] ReadResponse() failed: The server did not return a complete response for this request. ...

  10. 自定义alert弹框,title不显示域名

    问题: 系统默认的alert弹框的title会默认显示网页域名 解决办法: (修改弹框样式) (function() { window.alert = function(name) { $(" ...