锁:InterlockedCompareExchage, CriticalSection, Mutex

本文对比了几种锁机制的性能,从快到慢依次为InterlockedExchange、CriticalSection、SpinCriticalSection、自写SpinLock及Mutex。深入探讨了Mutex与CriticalSection的区别,以及如何使用InterlockedCompareExchange实现lock-free线程安全队列。

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

几种锁的性能比较

从快到慢:InterlockedExchange, CriticalSection, SpinCriticalSection, 自己写的SpinLock(Interlocked和死循环组成), Mutex

InterlockedExchange: CPU提供的一种机制,在更新内存的时候锁住内存总线,防止其他CPU同时也修改同一块内存。

interlocked指令会锁住内存总线,还会设置 memory barrier,导致CPU同步缓存,造成性能大幅下降,因此这个操作不易频繁使用。

Mutex VS CriticalSection :  Mutex是每次碰必进入内核态(600个时钟周期);CriticalSection是没有其他线程占用时在用户态(9个时钟周期),被占用时才陷入内核态(600个时钟周期)

 

lock-free的线程安全Queue:  可使用InterlockedCompareExchange+BusyWaiting循环+Sleep(0)的方式(自己写的SpinLock),实现不陷入内核态; 

套路:读取VAR的值a, 对a进行计算得到b,用Interlock比较VAR是否等于a, 等于则把b赋值给他,返回原值;返回值是a说明赋值成功了,返回值不是a说明别的线程修改了VAR(赋值失败);赋值失败则继续循环尝试以上操作(如果是SpinLock的话,在这里先busy-waiting直到锁变量释放,减少interlock的调用次数)

Interlock的汇编实现  原理 ( lock cmpxchg [ecx], edx)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值