原子操作库
XWOS的原子操作库
Categories:
少于1分钟
内存模型
与标准库一样,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()
:将数据掩码部分的位全部置1xwaop_c0m()
:将数据掩码部分的位全部清0xwaop_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()
:将位图所有位置1xwbmpaop_c0all()
:将位图所有位清0- 内存序:
acq_rel
- 读-改-写
xwbmpaop_s1i()
:将位图中某位置1xwbmpaop_c1i()
:将位图中某位清0xwbmpaop_x1i()
:将位图中某位翻转- 内存序:
acq_rel
- 读-测试-改-写
- 所有名字匹配正则表达式
xwbmpaop_.+_then_.+
的函数xwbmpaop_t0i_then_s1i()
:测试位图中某位是否为0,如果是,就将它置1xwbmpaop_t1i_then_c0i()
:测试位图中某位是否为1,如果是,就将它清0xwbmpaop_fls_then_c0i()
:从最高位起查找位图中第一个为1的位并将它清0xwbmpaop_flz_then_s1i()
:从最高位起查找位图中第一个为0的位并将它置1xwbmpaop_ffs_then_c0i()
:从最低位起查找位图中第一个为1的位并将它清0xwbmpaop_ffz_then_s1i()
:从最低位起查找位图中第一个为0的位并将它置1- 分为两种情况
- 测试成功,继续执行“改-写”操作,此时内存序为
xwaop_mo_acq_rel
- 测试失败,相当于读操作,此时内存序为
xwaop_mo_consume
- 测试成功,继续执行“改-写”操作,此时内存序为
- 所有名字匹配正则表达式
API参考
-
原子操作
-
位图原子操作