我听说INC指令不是原子的。那么,CAS指令如何成为原子?

时间:2015-10-01 02:37:51

标签: c multithreading atomic lock-free compare-and-swap

CAS是非常原始的无锁技术,我知道它是原子的。

此外,它比INC更复杂。

它应该比较值,如果值没有改变,CAS设置新值,同时保证其他线程不访问它。

然后,CAS如何是原子的,而INC则不是。

我还了解到LOCK INC是原子操作,但成本高于INC。

如果CAS也在内部使用类似LOCK INC的类似技术,为什么它被称为无锁技术?

CAS中使用的锁是否与我们通常知道的普通锁不同?

如果是这样,普通锁和cas的成本有多大差异?

2 个答案:

答案 0 :(得分:1)

CaS与锁定公司不同。 LOCK INC在语义上锁定内存并执行增量(锁并不总是发生,但效果与原来一样)。因此,LOCK INC保证增加该值,并且如果两个LOCK INC同时从相同值的两个不同线程发出,则结果将值增加两次。 LOCK INC永远不会失败。

CaS试着看看'操作。尝试操作(即,如果是Y则将值设置为X)并且它可以成功 - 如果值确实是Y或失败,如果它是其他的话。它没有任何支持者会成功。如果两个线程同时对同一个值发出相同的CaS操作,则只有其中一个会成功,而另一个会失败。

还有一个“原子增量”的概念,它基本上意味着增加值,但不会锁定它“#”;'。通常的方法是尝试在循环中将CaS转换为新的递增值,直到成功为止。每次失败都意味着新值和检查值将被调整。因此,对于高满足的值,原子增量可能会很慢。

答案 1 :(得分:0)

比较和交换(CAS)在大多数处理器体系结构上实现为原子处理器操作。由于它在硬件级别是原子的,因此在使用它时不需要显式锁定。 C编译器通常知道目标体系结构是否具有该指令,因此如果您在原子库中使用比较和交换操作,它很可能会使用此硬件操作(如果可用),而不会产生显式锁定的开销。

&#34;递增&#34;在多线程环境中没有明确定义;如果另一个线程已经更改了当前线程读取它的值,那么增量操作的结果应该是当前线程读取的值的一个,还是比另一个线程写入的值多一个?对于大多数人来说,直观的结果是它应该比当前线程读取的值多一个,但只有当另一个线程没有写入它时,这实际上使得增量比比较和交换更复杂。< / p>