c – 这是以原子方式读取和写入bool的正确方法吗?

c – 这是以原子方式读取和写入bool的正确方法吗?,第1张

概述布尔标志由两个线程切换.以下代码是否有意义? 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_boo 布尔标志由两个线程切换.以下代码是否有意义?

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

总结

以上是内存溢出为你收集整理的c – 这是以原子方式读取写入bool的正确方法吗?全部内容,希望文章能够帮你解决c – 这是以原子方式读取和写入bool的正确方法吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1219477.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存