第八章 用户模式下的线程同步

一、目的

        多线程下需要保持共享资源的一致性

二、原子访问

        InterlockedExchangeAdd(i) = i++; 

        第一步将i放进寄存器中;第二步i+1;第三步将寄存器中的值写进i;

        利用上述函数则可以防止三步被打断。

三、旋转锁

        一个线程设置一个while循环不停的访问一个全局变量。

        另一个线程则可以控制这个变量的值,来结束前一个线程的while循环。

        不值得使用

四、关键段

       关键段之间的代码只允许一个线程进入,其他线程被挂起。

       InitializeCriticalSection(PCRITTICAL_SECTION) 初始化

       EnterCriticalSection(PCRITTICAL_SECTION) 进去 (如果有其他线程进入了,则被挂起)

       LeaveCriticalSection(PCRITTICAL_SECTION) 出来

       DeleteCriticalSection(PCRITTICAL_SECTION) 删除

       TryEnterCriticalSection(PCRITTICAL_SECTION) 检查是否可以进入

       InitializeCriticalSectionAndSpanCount(PCRITTICAL_SECTION) (如果进入不了,可以多尝试几次,不必立马挂起)

五、Slim 读写锁

       和关键段相同,可以区分读者和写者。

       InitializeSRWLock(PSRWLOCK) 初始化

       AcquireSRWLockExclusive(PSRWLOCK) 保护写者

       ReleaseSRWLockExclusive(PSRWLOCK)

       AcquireSRWLockShared(PSRWLOCK) 保护读者

       ReleaseSRWLockShared(PSRWLOCK)

六、其他

       性能:原子函数小于读写锁小于关键段。

       高速缓存:程序访问一个字节时会把一个高速缓存行取回(32字节,64...)。

       因为它则要进行内存对齐,把成员变量归类存放在一起。如果希望变量总是从内存中读取则用Volatile修饰。

       条件变量:可以配合读写锁进行功能转换(资源满时写者休息,读者工作;资源空时读者休息,写者工作)

       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值