lock-free&wait-free

来源:互联网 发布:u盘安装linux系统教程 编辑:程序博客网 时间:2024/05/20 18:20

1.概念定义:

https://en.wikipedia.org/wiki/Non-blocking_algorithm


2.我的理解:

lock-free:需要取得锁的线程在有限步骤或时间内内就可以成功(多数线程都会成功,一些可能失败,比wait-free语义稍弱)

wait-free:需要取得锁的线程在有限步骤或时间内内就可以成功(任意线程都会成功,语义更加强烈)


3.例子(引用):


do { pred = tail;} while(!tail.compareAndSet(pred, node));
这部分代码就是lock-free的,分析如下:

假如多个线程(T1,T2)同时执行这段代码,无论T1和T2谁先执行,或者同时执行,最后都会成功。但是这似乎很明显,不能凸显lock-free的特征。但是如果T1在执行过程中发生了睡眠或挂起,那么T2到底是跟着block还是继续执行呢?这一点就是lock-free和mutex lock的区别,在mutex lock中,如果T1在获得锁之后发生挂起,那么T2也会跟着被block。但是在lock-free中,即使T1发生了挂起,T2还是会继续执行。

(内在原因:compareAndSet是硬件指令实现的,硬件的指令都是原子级别的,即在执行这个指令的过程中,不能被系统中断,没有所谓的执行到指令的一半时发生挂起,如此保证了lock-free中即使T1挂起,T2还是会执行。但是在mutex lock中,在T1获得锁之后是可以睡眠的,如

lock(T1);

do something; //此时发生挂起

这时T2就会被block。


4.参考文献:

1)http://gee.cs.oswego.edu/dl/papers/aqs.pdf

2)https://en.wikipedia.org/wiki/Non-blocking_algorithm

原创粉丝点击