请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

自旋锁是不是Lock Free?

以 i++ 为例子。

  1. 自旋锁不是 lock free , 线程持锁后进行 i++, 如果出现突发问题,导致线程阻塞等情况未释放锁,其他线程会处于等待.

  2. 如下代码实现 i++

do {
} while(!cas(&i, i, i+1));  
i++;

如果线程跳出循环后, 相对于其他线程一定是在 i++ 成功后自行 cas ,才能跳出 while , 如果跳出 while 的线程在执行 i++ 之前也出现突发问题,导致线程阻塞等情况未释放锁 (i++ 的操作等同于 自旋锁的释放锁的操作呀), 同理, 其他线程会处于等待。
不符合lock free, 也会让其他线程等待, 为什么是 lock free?

正在回答 回答被采纳积分+3

1回答

求老仙 2021-10-06 14:15:40

这段程序就可以实现`i++` ,是lock-free

do {
} while(!cas(&i, i, i+1));

这段程序是lock free。因为无论哪个线程阻塞,阻塞多久,总有线程可以进步。 


自旋锁不是lock-free

// 公共变量
lock = 0

// 
spinLock(){
  do {
  } while(!cas(&lock, 0, 1))
}

spinkLock执行过程中,如果有线程持有了锁,没有释放,那么其他线程都获取不了锁(无法进步)。 


是不是 LockFree的关键是在任何情况下,都有线程能进步。

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号