常见锁原理和使用-旋转锁和SRWLock

参考博客:http://blog.csdn.net/xiaobangkuaipao/article/details/77053439  线程同步

1、旋转锁:在实现旋转锁的时候InterlockedExchange及其有用。

while(InterlockedExchange(&flag,true) ==true) sleep(0);flag的值设为true,并检查原来的值是否为true,若是,则说明有其他线程正在使用该资源,于是while循环会继续执行,直到其他函数将flag改为false。缺点:旋转锁会消耗cpu时间,cpu不断比较两个值,直到另一个线程改变flagFlag不用设为Volatile类型。

2、关键段+旋转锁实现过程:许多开发人员会循环指定的次数(比如4000)如果届时仍无法访问资源,那么线程会切换到内核模式,并一直等到资源可供使用为止(此时它不消耗cpu时间)这就是关键段的实现方式;

    如果一个关键段正在被另外一个线程占用时,函数会立即把调用线程切换到等待状态,这意味着线程必须从用户模式切换到内核模式(大约1000个CPU周期),如果占用者马上用完,切换浪费了大量时间。

函数功能:初始化关键段并设置旋转次数

函数原型:

BOOLInitializeCriticalSectionAndSpinCount(

  LPCRITICAL_SECTIONlpCriticalSection,  //结构体地址

  DWORDdwSpinCount);                                 //旋转次数

函数说明:旋转次数一般设置为4000

函数功能:修改关键段的旋转次数

函数原型:

DWORDSetCriticalSectionSpinCount(

  LPCRITICAL_SECTIONlpCriticalSection,

  DWORDdwSpinCount);   //更新的旋转次数。


3、Slim读写锁Vs关键段:

相同点:对一个资源进行保护,不让其他线程访问它。

不同点:①轻型读写锁(SRWLock)允许区分哪些想要读取资源的值线程(读取者线程)和想要更新资源的值的线程(写入者线程)。让所有的读取者线程在同一时刻访问共享资源,在写入时独占。

②如果锁被占用,那么调用Acquire...阻塞调用线程。无TryEnter...之类的函数。

不能递归地获得SRWLock,一个线程不能为了多次写入资源而多次锁定资源。

VOID InitializeSRWLock(PSWLOCK SRWLock);

写入者:AcquireSRWLockExclusive(PSWLOCK SRWLock);

ReleaseSRWLockExclusive(PSWLOCK SRWLock)

读取者:AcquireSRWLockShared(PSWLOCK SRWLock);

ReleaseSRWLockShared(PSWLOCK SRWLock)

不存在删除或者销毁

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值