• CAS


    【本文链接】

    http://www.cnblogs.com/hellogiser/p/compare-and-swap.html

    CAS(compare and swap)操作实现

    【分析】

    当同时存在读写线程时,默认情况下是不保证线程安全的,因而需要利用信号量来进行线程同步(Synchronization),如关键代码段、互斥体等,同时操作系统也提供了相应的API。然而同步并不总是满足条件的且有效率的,比如陷入内核时会有性能损失、死锁、活锁以及资源浪费等。

    于是Lock-Free和Wait-Free的思想出现了,由于此时不存在读写线程的同步,因而在写线程运行时,读线程也在运行(多核中两个线程在不同的核上被调度运行),而且代码量减少,程序运行更快。而这一思想是通过CAS机制来实现。

    Compare & Set,或是 Compare & Swap,现在几乎所有的CPU指令都支持CAS的原子操作,X86下对应的是 CMPXCHG 汇编指令。有了这个原子操作,我们就可以用其来实现各种无锁(lock free)的数据结构。

    【代码1】

    这个操作用C语言来描述就是下面这个样子:(代码来自Wikipedia的Compare And Swap词条)意思就是说,看一看内存*reg里的值是不是oldval,如果是的话,则对其赋值newval。

     C++ Code 
    1
    2
    3
    4
    5
    6
    7
     
    int compare_and_swap (int *reg, int oldval, int newval)
    {
        
    int old_reg_val = *reg;
        
    if (old_reg_val == oldval)
            *reg = newval;
        
    return old_reg_val;
    }

    【代码2】

    这个操作可以变种为返回bool值的形式(返回 bool值的好处在于,可以调用者知道有没有更新成功)

     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    bool compare_and_swap (int *accum, int *dest, int newval)
    {
        
    if ( *accum == *dest )
        {
            *dest = newval;
            
    return true;
        }
        
    return false;
    }

    【参考】

    http://coolshell.cn/articles/8239.html

    http://blog.csdn.net/lifesider/article/details/6582338

    个人学习笔记,欢迎拍砖!---by hellogiser

    Author: hellogiser
    Warning: 本文版权归作者和博客园共有,欢迎转载,但请保留此段声明,且在文章页面明显位置给出原文连接。Thanks!
    Me: 如果觉得本文对你有帮助的话,那么【推荐】给大家吧,希望今后能够为大家带来更好的技术文章!敬请【关注】
  • 相关阅读:
    Codeforces
    Codeforces
    Codeforces
    Codeforces
    Codeforces
    Codeforces
    Codeforces
    Codeforces
    洛谷
    GXU
  • 原文地址:https://www.cnblogs.com/hellogiser/p/compare-and-swap.html
Copyright © 2020-2023  润新知