首页 > 试题广场 >

无锁化编程有哪些常见方法?

[不定项选择题]
无锁化编程有哪些常见方法?
  • 针对计数器,可以使用原子加
  • 只有一个生产者和一个消费者,那么就可以做到免锁访问环形缓冲区(Ring Buffer)
  • RCU(Read-Copy-Update),新旧副本切换机制,对于旧副本可以采用延迟释放的做法
  • CAS(Compare-and-Swap),如无锁栈,无锁队列等待
ABCD吧。
A 这方法虽然不太好,但是常见
B ProducerConsumerQueue就是这个,到处都是
C linux kernel里面大量使用
D 本质上其实就是乐观锁,操作起来很困难。。单生产者多消费者或者多生产者单消费者的情况下比较常见,也不容易遇到ABA问题。
发表于 2015-03-24 20:42:00 回复(4)
更多回答
最朴素最简单的原语   CAS(compare-and-swap)   操作即可以完成所有的无锁功能,其他的如   LL/SC (load linked/store conditional)  
发表于 2015-08-18 10:04:38 回复(0)
其实这个非常的不明白,等等大牛的解析
发表于 2015-08-04 21:50:44 回复(0)
这阿里的题目真不白给。。都不知道四个选项说的是啥
发表于 2016-06-11 23:02:09 回复(15)
A 原子操作是汇编级别支持的指令lock xadd,如c++中的interlockIncrement,java中有AutomicInteger都是对其的封装。简单变量的线程同步用这种方式效率最高。
B 多个生产者和多个消费者,一样可以做到免锁访问,但要使用原子操作。这里的意思应该是不用原子操作级别的免锁,理由也很简单,生产者和消费者需要修改的位置是分开的(生产者加在尾部,消费者从头部消费),且只有一个读一个写,不会发生冲突。所以只有一点需要关注,就是尾部指针和头部指针每次需要比较以避免生产溢出或者过度消费,而简单变量的读操作都是原子的。
C 类似的一个概念叫CopyOnWrite,复制一份,修改完后,替换回去时只需替换一个指针或引用,锁住的粒度非常小。但有可能还有线程持有的是旧的指针,因此旧的副本需要延迟释放。
D 汇编级别支持的指令cmpxchg,锁定内存地址,比较地址中修改前的内容是否与修改时的值一致,如果不一致就说明有其他线程改动,需要重新做。如,内存地址0x123456中原来存放的是10101010,但CPU执行到cmpxchg指令时,发现内存中变成了11111111,那么就认为其他线程已经修改了这个地址的值,需要重新读取0x123456中的值11111111,再做一次cmpxchg,如果这次发现内存中仍然是11111111,那么cmpxchg就会把新的值写入到0x123456中去。这里面有个ABA问题,就是有线程改了2次从11111111 -> 10111111 -> 11111111,那么CAS操作是识别不了的,需要从业务层去避免,如果直接在0x123456再放一个地址值,而地址值如果不先释放再重新申请内存,就不会出现重复值。
编辑于 2018-04-04 00:00:13 回复(3)
ABCD
JAVA对应:
A:AtomicInteger
C:CopyOnWriteArrayList
D:Unsafe
发表于 2017-03-17 11:33:30 回复(1)
居然还有多选题
发表于 2020-06-01 16:46:25 回复(0)
看到这个题目整个人都是蒙的状态。完全不知道怎么回事,好好百度一下
发表于 2019-03-19 23:07:33 回复(0)
A 这方法虽然不太好,但是常见。(觉得是原子操作,有隔离作用)
B ProducerConsumerQueue就是这个,到处都是
C linux kernel里面大量使用RCU
D 本质上其实就是乐观锁,操作起来很困难。。单生产者多消费者或者多生产者单消费者的情况下比较常见,也不容易遇到ABA问题。
编辑于 2018-03-12 00:08:56 回复(0)
貧我敏锐的直觉,abcd全对,关键一个都不懂😂
发表于 2017-12-14 15:02:02 回复(0)
完成没见过……
发表于 2017-06-05 10:15:19 回复(0)
不是多选题吗?
发表于 2017-03-23 16:54:40 回复(0)
其实我连什么是无锁化编程是什么都不知道,更别提cas了
发表于 2017-03-14 13:05:30 回复(0)
锁的原理不是类似队列吗,执行完锁里的内容,下一个再执行
发表于 2016-08-01 08:12:49 回复(0)
无锁化编程是指什么??忽略进程同步的考虑吗??那么B有个环形队列,每次要加的时候判断队头是否等于队尾,取的时候同样判断下,为什么不行??求解答??
发表于 2015-08-22 16:26:12 回复(0)
A  __sync_fetch_and_add
B  linux kfifo
D  CAS DCAS
发表于 2015-03-12 14:53:47 回复(0)