Interlocked系列函数

  • 原子访问:线程在访问某个资源的时候能保证没有其他线程会在同一时刻访问同一资源
函数名 功能
InterlockedExchangeAdd
InterlockedExchangeAdd64
增/减
InterlockedExchange
InterlockedExchange64
InterlockedExchangePointer
交换
InterlockedCompareExchange16
InterlockedCompareExchange
InterlockedCompareExchange64
InterlockedCompareExchangePointer
比较赋值
InterlockedAnd16
InterlockedAnd
InterlockedAnd64
InterlockedOr16
InterlockedOr
InterlockedOr64
InterlockedXor16
InterlockedXor
InterlockedXor64
异或

注意点:

  • InterlockedXxx is atomic only with respect to other InterlockedXxx calls.
  • The parameters for this function must be aligned on a 32-bit boundary; otherwise, the function will behave unpredictably on multiprocessor x86 systems and any non-x86 systems. See _aligned_malloc.(上述部分函数在MSDN解释里有这句话)
  • 使用_aligned_malloc分配一块对齐过的内存。对应释放函数:_aligned_free

关键段

函数名 功能
InitializeCriticalSection 初始化
EnterCriticalSection 等待直至获取到关键段的所有权
LeaveCriticalSection 释放关键段的所有权
DeleteCriticalSection 资源释放
TryEnterCriticalSection 尝试获取关键段的所有权,此函数不会等待
InitializeCriticalSectionAndSpinCount 初始化具有螺旋锁的关键段
备注:线程被切换到等待前会先进行旋转,从而可能会提高性能
SetCriticalSectionSpinCount 设置关键段的螺旋锁的旋转次数
备注:用来保护进程堆的关键段所使用的旋转次数大约是4000

EnterCriticalSection注意事项

  • 此函数超时会引发异常,超时时间在注册表中可以设置(默认30天左右)
  • 线程可以在EnterCriticalSection成功后继续EnterCriticalSectionTryEnterCriticalSection,每一次成功获取访问权都需要对应使用LeaveCriticalSection
  • 当线程调用EnterCriticalSection时,关键段的访问权已被占用,那么关键段会在内部使用一个事件内核对象,只有在第一次要用到事件内核对象时,系统才会去创建他(当进程能使用的内存过低时,这个创建可能会失败,从而会抛出异常),此时系统会切换到内核模式,此过程开销很大。为此,使用附带螺旋锁的关键段的性能可能会比不使用螺旋锁的关键段的性能高

InitializeCriticalSection注意事项

  • 在进程能使用的内存过低时,此函数可能会失败并会抛出异常

InitializeCriticalSectionAndSpinCount注意事项

  • 此函数的旋转次数的最高位设为1,则会在初始化时创建一个与关键段相关联的事件内核对象,从而可能防止EnterCriticalSection调用时因为事件内核对象分配问题而抛出异常

Slim 读/写锁

函数名 功能
InitializeSRWLock Initialize a slim reader/writer (SRW) lock.
AcquireSRWLockExclusive Acquires a slim reader/writer (SRW) lock in exclusive mode.
AcquireSRWLockShared Acquires a slim reader/writer (SRW) lock in shared mode.
ReleaseSRWLockExclusive Releases a slim reader/writer (SRW) lock that was acquired in exclusive mode.
ReleaseSRWLockShared Releases a slim reader/writer (SRW) lock that was acquired in shared mode.
TryAcquireSRWLockExclusive Attempts to acquire a slim reader/writer (SRW) lock in exclusive mode. If the call is successful, the calling thread takes ownership of the lock.
Win7以上才支持
TryAcquireSRWLockShared Attempts to acquire a slim reader/writer (SRW) lock in shared mode. If the call is successful, the calling thread takes ownership of the lock.
Win7以上才支持

注意点

  • SRW locks do not need to be explicitly destroyed.
  • An SRW lock is the size of a pointer. The advantage is that it is fast to update the lock state. The disadvantage is that very little state information can be stored, so SRW locks cannot be acquired recursively(递归地). In addition, a thread that owns an SRW lock in shared mode cannot upgrade(提升) its ownership of the lock to exclusive mode.
  • SRWLock系列函数不支持Windows Xp,支持的最低版本是Windows Vista,关键段支持Windows Xp
  • 线程使用Slim读/写锁相较于关键段更具有可伸缩性

Windows用户模式下的线程同步相关推荐

  1. 用户模式下的线程同步

    在以下两种基本情况下,线程之间需要相互通信 1.需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性 2.一个线程需要通知其他线程某项任务已经完成. 原子访问相关的内容就直接略过了,因为感觉实 ...

  2. Chapter09-内核模式下的线程同步之事件内核对象

    有两种事件内核对象:自动事件和手动事件.当手动事件被触发时,所以该事件的等待线程都编程可调度状态:而自动事件被触发时,只有个一个等待该事件线程变成可调度状态. 下面再逐个讲解Event的相关函数: a ...

  3. 内核和用户模式下进程与线程创建

    文章目录 内核模式下进程与线程的创建 进程创建 线程创建 用户模式下进程与线程的创建 内核模式下进程与线程的创建 进程创建 在内核模式中,一个进程的创建是从函数NtCreateProcess开始的.该 ...

  4. windows用户模式与内核模式

    对于Windows操作系统的编程一般来说已经涉及到了较深的领域,针对该问题提出几家之言,均为转载: 一. 为了防止用户程序访问并篡改操作系统的关键部分,Windows使用了2种处理器存取模式(事实上W ...

  5. 通过 Windows 用户模式回调实施的内核攻击

    这篇文章翻译自一篇多年之前的论文,原文作者是 Tarjei Mandt.原文系统地描述了 win32k 的用户模式回调机制以及相关的原理和思想,可以作为学习 win32k 漏洞挖掘的典范.早前曾经研读 ...

  6. 在单用户模式下启动SQL Server的不同方法

    In this article, we will review different ways to start SQL Server in single user mode. 在本文中,我们将介绍在单 ...

  7. linux7启动某个服务器,如何在单用户模式下启动RHEL 7 CentOS 7服务器

    对于Linux系统管理员,以单用户模式引导RHEL 7 / CentOS 7服务器是最常见的日常活动.单用户模式被视为维护或紧急模式,我们可以执行我们的故障排除步骤.以下是我们需要在单用户模式下启动R ...

  8. linux单用户模式修复磁盘,在单用户模式下使用fsck命令修复受损的Mac硬盘

    在Mac上使用磁盘工具来恢复硬盘是官方推荐的方法,不过万一连系统都进不去就操蛋了.所以在很多情况下,在Unix/Linux系统的单用户模式下使用fsck都是最后的救命稻草. fsck 这个命令行工具在 ...

  9. linux 返回非法指令,linux – ARM Cortex A7在内核模式下返回PMCCNTR = 0,在用户模式下返回非法指令(即使在PMUSERENR = 1之后)...

    我想在Raspberry Pi 2上读取循环计数寄存器(PMCCNTR),它有一个ARM Cortex A7内核.我为它编译了一个内核模块,如下所示: #include #include int in ...

最新文章

  1. html 点击一行变色,elementui点击table每一行会变色,当有固定列的时候,
  2. ABAP-获取用户的组织结构权限
  3. SpringMVC应用拦截器判断用户是否登录
  4. 数据结构录 之 单调队列单调栈。
  5. wxWidgets:wxResourceTranslationsLoader类用法
  6. Razor Page Library:开发独立通用RPL(内嵌wwwroot资源文件夹)
  7. 使用Spring Boot和Logback登录到Redis
  8. 第二章--电商设计表
  9. 一步一步学习PHP(4)——函数
  10. mysql primary重复_mysql:键'PRIMARY'和奇怪的ID行为重复条目'0'
  11. hdu3336 Count the string
  12. SQL server 2008 r2 安装出错 Could not open key:
  13. 零基础自学SQL课程 | SQL中的日期函数大全
  14. 加密日记 android,Lifeograph加密日记应用程序
  15. [转]密码算法揭秘,一文让你成为国际安全算法与国密算法专家
  16. Spring微服务实战第1章 欢迎迈入云世界,Spring
  17. 用程序实现基本计算器功能
  18. 爱普生Epson Stylus Photo P50 打印机驱动
  19. MySQL优化之——函数
  20. 基于ATR确定头寸的择时股票量化策略

热门文章

  1. win7系统mysql连接不上数据库吗_Win7系统使用数据库时mysql频繁掉线无法连接的两种解决方法...
  2. python输入文本的缩写是什么_Python如何使用NLP从缩写文本中插入单词?
  3. java servletlis_Java学习(六)servlet 的引入
  4. 二维卷积神经网络的结构理解
  5. Tensor 和Numpy转换
  6. DCMTK:wwwapp instalation
  7. 怎样保持sublime text3中的代码copy到CSDN中之后的漂亮的高亮
  8. 实时计算轻松上手,阿里云DataWorks Stream Studio正式发布
  9. Vsftp在Ubuntu的安装与配置
  10. 重装Microsoft .NET Framework 4.0