加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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参考.合理?
>为了一蹴而就,我也宣称它不稳定.
>这些功能是静态的

更新:

我想问的基本问题是:
什么是原子性和记忆障碍之间的区别?如果线程A正在变量foo上执行原子内置,则线程B不能对变量foo执行任何操作;因此创造了一个记忆障碍?

解决方法

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不提供简单的加载/存储特殊原子操作的原因:它们已经被认为是原子的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读