线程同步一大部分与原子访问(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. 验证码之SimpleCaptcha (二)

    上回说到了简单的使用simpleCaptcha,这次我们这次我们将讲解扩张simpleCaptcha.       回到正题,我们需要一些自定义的验证码,比如验证码的字体大小,背景,颜色等等,默认的验 ...

  2. 上传RNA-seq数据到NCBI GEO数据库

    SRA - NCBI example - NCBI 要发文章了,审稿时编辑肯定会要求你上传NGS测序数据. 一般数据都是放在集群,不可能放在个人电脑上,因为有的数据大的吓人(几个T). 所以我们就建一 ...

  3. Axios的默认配置(碎片知识)API

    axios API axios(config) axios({ method: 'Post', url: '/user/123', data: { //略 } }) axios(url[, confi ...

  4. vux, vue上拉加载更多

    <template> <" :bottom-method="loadBottom" :bottom-all-loaded="bottomAll ...

  5. Composer 的学习

    一.Composer简介 Composer 是PHP用来管理依赖关系的工具. 使用 composer 的必要前提有: 1.PHP版本要高于PHP5.3.2 2.PHP支持OpenSSL扩展 3.安装有 ...

  6. 【JS】【3】标签显示几秒后自动隐藏

    $("#XXX").show().delay(2000).hide(0); 2000,0:可选,速度,(毫秒:"slow":"fast") ...

  7. js 异步加载

    document 加载 document.write("<scr" + "ipt src=\"js/jquery.js\"></sc ...

  8. URL与URI的含义及区别

    1.1 什么是URI? 简单点说:URI就是通用资源标志符,不理解是吧,我第一次听说也是不理解. 进一步说:网络上的一些资源(文档.图片.音频.视频.程序等)都是有一些通用资源标识(Universal ...

  9. Leetcode 1004. 最大连续1的个数 III

    1004. 最大连续1的个数 III  显示英文描述 我的提交返回竞赛   用户通过次数97 用户尝试次数143 通过次数102 提交次数299 题目难度Medium 给定一个由若干 0 和 1 组成 ...

  10. UI界面按钮增强

    (我是菜鸟,知道的少) 1.有HTML页面代码的,可以编辑 <%@page language="abap" %> <%@extension name=" ...