windows的并发编程机制

本文介绍了Windows下的并发编程机制,包括内核级别的互斥、信号量、事件等,以及高级同步结构如CRITICAL_SECTION、SRWL、CONDITION_VARIABLE等。还讨论了等待函数及隐含的同步结构键值事件,并给出了注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

windows的并发编程机制


  1. 内核
    1. 互斥(Mutex)
    2. 信号量(Semaphore)
    3. 自动重置事件(Auto-Reset Event)
    4. 手动重置事件(Manual-Reset Event)
    5. 等待定时器(Waitable Timer)

 

  1. 高级同步结构
    1. CRITICAL_SECTION: 使用一个Auto-Reset Event内核对象
    2. vista中的轻量级读写锁SRWL

    VOID WINAPI InitializeSRWLock(PSRWLOCK SRWLock);  //只需初始化,不需要delete

    VOID WINAPI AcquireSRWLockExclusive(PSRWLOCK SRWLock) //独占模式等待

    VOID WINAPI AcquireSRWLockShared(PSRWLOCK SRWLock) //共享模式等待

    VOID WINAPI ReleaseSRWLockExclusive(PSRWLOCK SRWLock) //独占模式释放

    VOID WINAPI ReleaseSRWLockShared(PSRWLOCK SRWLock) //共享模式释放

    1. vista中的条件变量CONDITION_VARIABLE,相当于SignalObjectAndWait

    BOOL WINAPI SleepConditionVariable{CS/SRW}

    VOID WINAPI WakeConditionVariable(PCONDITION_VARIABLE ConditionVariable)

    VOID WINAPI WakeAllConditionVariable(PCONDITION_VARIABLE ConditionVariable)

     

 

  1. 等待函数
    1. [Msg/Com]WaitForSingleObject[Ex]
    2. [Msg/Com]WaitForMultipleObjects[Ex]
    3. SignalObjectAndWait

    其中Msg: GUI程序,Com: Com程序,当线程等待时仍可以分发消息

 

  1. 隐含的同步结构
    1. 键值事件(Keyed Event) : windows xp and above(hidden)

    一个整个系统的全局事件,即等待线程的链表或hash表,存储了正在等待的事件的线程,不同互斥对象通过K来区分,通常为内存地址,键值事件已经是vista及以后系统中读写锁/条件变量的内部实现机制

 

  1. 注意事项:

  2. 在使用同步时优先选择高级同步结构如CRITICAL_SECTION/SRWL/CONDITION_VARIABLE,因为它们是在用户级实现的,可以相比于内核级的同步机制,减少内核切换,提高效率
  3. 对于运行时间很短的需要并发执行的程序可以利用线程池实现,而需要长时间运行的程序可以指定WT_TRANSFER_IMPERSONATION是线程池生成新的线程,或自己生成新线程并负责管理
  4. 使用线程池时,如果仅在vista及以上的系统上运行应尽量使用新的线程池api并尽可能采用SRWL/CONDITION_VARIABLE实现互斥与同步,如果考虑xp等的兼容性则应使用原api
  5. 编写并发程序时,应注意线程调度,缓存一致性等对性能的影响。注意不同细粒度对并发程序的影响,将伪并发(由于同步/互斥造成的线程排队运行的情况)修改为串行,减少不必要的开销。
  6. 可采用指定cpu运行的方式提高局部性
  7. 完成程序后最好测试一下并发与串行间的性能差异,选择更优的方案。

 

 

 

 

  1. 参考文献

  2. Joe Duffy. Windows并发编程指南[M]. 机械工业出版社. 2010
  3. Joe Duffy. Windows keyed events, critical sections, and new Vista synchronization features[OL]. http://www.bluebytesoftware.com/blog/PermaLink,guid,db9f8f5b-8d1d-44b0-afbd-3eadde24b678.aspx.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值