Windows用户模式下的线程同步

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读/写锁相较于关键段更具有可伸缩性
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,770评论 0 38
  • 01. 我在厦门,被推着挤着走在乌央乌央不走不行的鼓浪屿,我摸不到头脑。 夏日的灼热不给我的脑袋留有任何思考的余地...
    刘浩烨阅读 541评论 0 0
  • 这个世界挺难,但从内心深处我们向往着美好,即便有时我们的内心充斥着焦虑、浮躁,但只要内心向善,总也会因爱包容。 这...
    JennieF阅读 229评论 0 0
  • 在秋山木工成立第13年的一个晚上,秋山利辉在思考如何培养成一流人才时,彻夜难眠,终于总结出《匠人须知30条》: 1...
    马唐阅读 1,238评论 0 0