原子操作库

XWOS的原子操作库

内存模型

与标准库一样,XWOS的原子操作分为6种内存模型:

xwaop_mo_relaxed

松散序,不作任何内存屏障操作。

xwaop_mo_consume

消费序,会在读操作之间增加 Data dependency barrier 。 这个屏障并不常见,对于常见的x86/ARM都是自动处理 Data dependency barrier 的。 据作者所知,目前只有Alpha架构的CPU需要程序员关注 Data dependency barrier 。 Rust语言干脆连这个内存序都不提供。

xwaop_mo_acquire

获得序,常常与配合读一起使用,形成 load-acquire

xwaop_mo_release

释放序,常常与配合写一起使用,形成 store-release

xwaop_mo_acq_rel

获得释放序,加载时是 acquire 的,回写时是 release 的。通常用于 读-改-回写 这种原子操作。

xwaop_mo_seq_cst

一致序,表明CPU对内存的访问顺序是严格按照程序代码(编译后的)的顺序所进行的。这在期刊文献中被称为 Sequential Consistency

原子操作

XWOS提供了原子操作模板库, 基本类型 中定义的各种 基本类型 都可使用原子操作。 XWOS的原子操作库,可以与标准库 <stdatomic.h> 中的原子操作混合使用。

原子操作函数模板包括:

    • xwaop_load() :加载
      • 可以指定6种内存序
    • xwaop_read() :读
      • 内存序: xwaop_mo_acquire
    • xwaop_store() :存储
      • 可以指定6种内存序
    • xwaop_write() :写
      • 内存序: xwaop_mo_release
  • 读-改-写
    • 基本运算
      • xwaop_add() :加
      • xwaop_sub() :减
      • xwaop_rsb() :反向减法
      • 内存序: xwaop_mo_acq_rel
    • 位运算
      • xwaop_and() :与
      • xwaop_or() :或
      • xwaop_xor() :异或
      • 内存序: xwaop_mo_acq_rel
    • 位操作
      • xwaop_s1m() :将数据掩码部分的位全部置1
      • xwaop_c0m() :将数据掩码部分的位全部清0
      • xwaop_x1m() :将数据掩码部分的位全部翻转
      • 内存序: xwaop_mo_acq_rel
  • 读-测试-改-写
    • 所有名称匹配正则表达式 xwaop_t.+_then_.+ 的函数
      • 分为两种情况
        • 测试成功,继续执行“改-写”操作,此时内存序为 xwaop_mo_acq_rel
        • 测试失败,相当于读操作,此时内存序为 xwaop_mo_consume

所有原子操作函数的第一个参数均为 基本类型 ,第二个参数是原子数据的指针,例如:

xwer_t rc;
xwsq_a refcnt = v;
xwsq_t nv, ov;

/*
 * 测试refcnt是否为0:
 * + ture: refcnt增加1,nv返回refcnt增加以后的新值,ov返回refcnt增加以前的旧值,
 *         内存序:acq_rel,rc为返回值XWOK;
 * + false: nv与ov都返回refcnt的值,内存序:consume,rc为返回值-EACCES;
 */
rc = xwaop_teq_then_add(xwsq_t, &refcnt, 0, 1, &nv, &ov);

位图原子操作

位图( xwbmp_t 数组)可进行原子操作,XWOS提供了基本函数库:

  • 声明
    • xwbmpaop_define() :声明原子位图
    • xwbmpaop_t1i() :测试位图中的某位是否被置1
    • 内存序: consume
    • xwbmpaop_s1all() :将位图所有位置1
    • xwbmpaop_c0all() :将位图所有位清0
    • 内存序: acq_rel
  • 读-改-写
    • xwbmpaop_s1i() :将位图中某位置1
    • xwbmpaop_c1i() :将位图中某位清0
    • xwbmpaop_x1i() :将位图中某位翻转
    • 内存序: acq_rel
  • 读-测试-改-写
    • 所有名字匹配正则表达式 xwbmpaop_.+_then_.+ 的函数
      • xwbmpaop_t0i_then_s1i() :测试位图中某位是否为0,如果是,就将它置1
      • xwbmpaop_t1i_then_c0i() :测试位图中某位是否为1,如果是,就将它清0
      • xwbmpaop_fls_then_c0i() :从最高位起查找位图中第一个为1的位并将它清0
      • xwbmpaop_flz_then_s1i() :从最高位起查找位图中第一个为0的位并将它置1
      • xwbmpaop_ffs_then_c0i() :从最低位起查找位图中第一个为1的位并将它清0
      • xwbmpaop_ffz_then_s1i() :从最低位起查找位图中第一个为0的位并将它置1
      • 分为两种情况
        • 测试成功,继续执行“改-写”操作,此时内存序为 xwaop_mo_acq_rel
        • 测试失败,相当于读操作,此时内存序为 xwaop_mo_consume

API参考