c – 这是以原子方式读取和写入bool的正确方法吗?
发布时间:2020-12-16 10:20:52 所属栏目:百科 来源:网络整理
导读:布尔标志由两个线程切换.以下代码是否有意义? static bool ATOMIC_BOOL_READ( volatile bool var ){ return __sync_fetch_and_or(var,0);}static void ATOMIC_BOOL_WRITE(volatile bool var,bool newval ){ __sync_bool_compare_and_swap( var,!newval,newv
布尔标志由两个线程切换.以下代码是否有意义?
static bool ATOMIC_BOOL_READ( volatile bool& var ) { return __sync_fetch_and_or(&var,0); } static void ATOMIC_BOOL_WRITE(volatile bool& var,bool newval ) { __sync_bool_compare_and_swap( &var,!newval,newval); } 请注意以下几点: >我正在传递bool参考.合理? 更新: 我想问的基本问题是: 解决方法
Atomics本质上是不可移植的,这些是GCC扩展,将来可能不再存在,并且不适用于其他编译器.
只有在完全理解上述陈述后,才应阅读答案的其余部分. 一个值得注意的事实是,现有的所有机器始终保证对特定大小的数据的访问是原子的.这来自基本概念,即存储器和系统总线中的数据以一定的粒度传输.在大多数机器中,布尔值应该绝对是原子的,因此: bool ATOMIC_BOOL_READ(volatile bool* b) { bool v = *b; __sync_synchronize(); // ensure value pushed to memory return v; } void ATOMIC_BOOL_WRITE(volatile bool* b,bool v) { __sync_synchronize(); // read will return fresh value *b = v; } 这可能就是为什么GCC不提供简单的加载/存储特殊原子操作的原因:它们已经被认为是原子的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |