CAS和ABA问题

简介: 定义无锁编程是指在不使用锁的情况下,在多线程环境下实现多变量的同步。即在没有线程阻塞的情况下实现同步。这样可以避免竞态、死锁等问题。原理CAS是指Compare-and-swap或Compare-and-SetCAS是一个原子操作,用于多线程环境下的同步。

定义

无锁编程是指在不使用锁的情况下,在多线程环境下实现多变量的同步。即在没有线程阻塞的情况下实现同步。这样可以避免竞态、死锁等问题。

原理

CAS是指Compare-and-swap或Compare-and-Set
CAS是一个原子操作,用于多线程环境下的同步。它比较内存中的内容和给定的值,只有当两者相同时(说明其未被修改),才会修改内存中的内容。
实现如下:

int compare_and_swap(int* reg, int oldval, int newval)
{
  ATOMIC();
  int old_reg_val = *reg;
  if (old_reg_val == oldval)
     *reg = newval;
  END_ATOMIC();
  return old_reg_val;
}

bool compare_and_swap(int *accum, int *dest, int newval)
{
  if (*accum == *dest) {
      *dest = newval;
      return true;
  } else {
      *accum = *dest;
      return false;
  }
}

返回bool值得好处是可以知道是否设置成功。

在实际环境中,使用的是:

bool __sync_bool_compare_and_swap (type *ptr, type oldval, type newval, ...)
type __sync_val_compare_and_swap (type *ptr, type oldval, type newval, ...)

在使用CAS时,需要先获取操作变量的值并放到oldval中,之后调用cas函数,直到调用成功。例如给变量val赋值

while(true)
{
    int oldval=val;
    if(__sync_bool_compare_and_swap(&val, oldval, newval))
        break;
}

ABA问题

在多线程环境中,使用lock-free的CAS时,如果一个线程对变量修改2次,第2次修改后的值和第1次修改前的值相同,那么可能就会出现ABA问题。以上面的例子为例:
假设有两个线程P1和P2,P1执行完int oldval=val后被其他线程抢占。P2线程在此期间修改了val的值(可能多次修改),但最终val的值和修改前一样。当P1线程之后运行CAS函数时,并不能发现这个问题。这就是ABA问题。

解决方法

一个常用的方法是添加额外的“tag”或“stamp”位来标记是指针是否被修改过。

参考:
Compare-and-swap

ABA problem

目录
相关文章
|
6月前
|
算法 Java
浅谈一下CAS和ABA问题
浅谈一下CAS和ABA问题
73 0
|
存储 资源调度 安全
H3C CAS系列 一、CAS初认识
对于虚拟化,可能第一时间大家想到的是虚拟机,而对于虚拟机大家可能第一时间想到的就是我们大多数人都可能比较熟悉的VMware系列产品,比如常用VMware Workstation Pro 、VMware esxi。 而今天我带大家一起认识一款我们国产的虚拟化软件 H3C CAS。
1776 0
|
1月前
|
安全
【多线程】CAS、ABA问题详解
【多线程】CAS、ABA问题详解
21 0
|
3月前
|
Java
JUC(10)深入理解CAS和ABA
这篇文章深入探讨了Java中的CAS(Compare-And-Swap,比较并交换)操作,解释了CAS的工作原理、应用场景以及存在的循环耗时、单变量原子性保证和ABA问题等缺点,并介绍了如何使用原子引用和版本号来解决ABA问题。
JUC(10)深入理解CAS和ABA
|
6月前
|
Java API
CAS的超~详细介绍
CAS的超~详细介绍
|
6月前
详解CAS及ABA问题
详解CAS及ABA问题
104 0
|
6月前
|
算法 Java 关系型数据库
CAS
本文主要讲解java中cas的概念及原理
64 0
解决CAS机制中ABA问题的AtomicStampedReference详解
AtomicStampedReference是一个带有时间戳的对象引用,能很好的解决CAS机制中的ABA问题,这篇文章将通过案例对其介绍分析。
305 0
解决CAS机制中ABA问题的AtomicStampedReference详解
什么是 CAS? CAS 有哪些缺点?ABA 问题是什么?
什么是 CAS? CAS 有哪些缺点?ABA 问题是什么?
202 0