竞态与同步(2)

除了前面信号量、自旋锁等方法,LDD中还介绍了一写免锁算法,主要包括:
环形缓冲、原子变量、位操作、seqlock、RCU等。

  • 原子变量
    原子变量的操作通常会被编译成一条指令。
    可以对一个值原子的加减、赋值、测试等,
    原子变量只有24位长度
#include <asm/atomic.h>
//初始化
atomic_t v = ATOMIC_INIT(0);
//读取
int atomic_read(&v);
//加减
void atomic_add(int i, &v);
void atomic_sub(int i, &v);
void atomic_inc( &v);
void atomic_dec( &v);
//加减并测试,计算结束后为0则返回真
int atomic_inc_and_test( &v);
int atomic_dec_and_test( &v);
int atomic_sub_and_test(int i, &v);
int atomic_add_negative(int i, &v); //将i加到v,结果为负时返回真
//加减并返回计算后的值(转为整形)
int atomic_add_return(int i, &v);
int atomic_sub_return(int i, &v);
int atomic_inc_return(&v);
int atomic_dec_return(&v);

原子变量不能直接当作整形变量使用,应通过上面函数取出其值

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 接着上节 mutex,本节主要介绍atomic的内容,练习代码地址。本文参考http://www.cplusplu...
    jorion阅读 73,927评论 1 14
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,932评论 18 399
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,350评论 0 33
  • 今天的晨读讲述的是焦虑,从精选了3个方面的内容和大家一起分享:焦虑与生俱来,有效重写规则和焦虑自助疗法。 焦虑对我...
    张德祥阅读 949评论 0 2
  • 结构化应用数据 在前面的章节中,我们基本接触了建造Odoo后台应用的所有层面。下面我们就要具体分析‘model,v...
    F4A3阅读 3,647评论 0 0