无锁的数据结构(Lock-Free)及CAS(Compare-and-Swap)机制

本文探讨了Lock-Free思想及其通过CAS(Compare-and-Swap)机制实现线程安全的方式,避免了传统同步带来的性能损失和死锁等问题。Windows API提供了InterLocked函数支持原子操作。在多读一写场景下,CAS允许读写线程并行运行,提高效率。然而,C/C++环境下旧数据的释放成为挑战,通常需要额外策略来解决。

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

当同时存在读写线程时,默认情况下是不保证线程安全的,因而需要利用信号量来进行线程同步(Synchronization),如关键代码段、互斥体等,同时操作系统也提供了相应的API。然而同步并不总是满足条件的且有效率的,比如陷入内核时会有性能损失、死锁、活锁以及资源浪费等。

于是Lock-Free和Wait-Free的思想出现了,由于此时不存在读写线程的同步,因而在写线程运行时,读线程也在运行(多核中两个线程在不同的核上被调度运行),而且代码量减少,程序运行更快。而这一思想是通过CAS机制来实现,如下

template<typename T>

bool CAS(T* ptr, T expected, T fresh)

{

    if(*ptr != expected)

         return false;

    *ptr = fresh;

    return true;

}

CAS的原理是,将旧值与一个期望值进行比较,如果相等,则更新旧值,类型T = {char, short, int, __int64, ...}等,以及指针(pointer to any type)。

注意CAS这里只是说明了原理,并不是真实的源代码实现,具体实现请参考操作系统。

在Windows API中,提供了很多原子操作(Atomic Operatoration),如InterlockedCompareExchange等一系列InterLocked函数,从汇编的角度来讲,intel的XCHG指令即可以一个时钟周期内完成数据的交换(寄存器和内存的数据交换),使用方法可参考InterlockedCompareExchange的反汇编代码。

考虑这样一种情况:存在多个读线程和一个写线程,在使用同步方法时,很可能写线程并不能立即获得锁,最坏的情况下是写线程永远得不到锁,即进入活锁

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值