【问题标题】:assembly intrinsic for atomic bit test and set (BTS)原子位测试和设置 (BTS) 的内部组装
【发布时间】:2014-05-23 08:29:16
【问题描述】:

struct node* address; //format <addr,flagBit1,flagBit2>

我想使用 BTS 来原子地设置flagBit1 位。

编辑

我想盲目设置这个位,而不关心之前是否设置过

我可以按照Using bts assembly instruction with gcc compiler 中的建议使用汇编代码来完成这项工作

但是我可以使用一个可以跨不同架构移植的内在函数吗?

例如,gcc Atomic Builtins 具有 __sync_fetch_and_or。这和BTS有相同的属性吗?

【问题讨论】:

  • 是的,但是请看gcc bug report
  • @Jester:感谢您的参考。我对flagBit 的先前值不感兴趣。我只是想盲目地设置它而不关心它之前是否设置过
  • 如果你不需要原子性,gcc 中的 cmets 似乎说使用 bts 可能会减慢你的代码...
  • 我需要原子性。否则我宁愿使用按位运算。相应地更新了问题
  • 你能用C11吗?目前支持非常少,但它应该提供合适的原子操作。否则, __sync 内置函数应该可以工作(尽管它们目前不会使用 bts)。请注意,它们已被替换:gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html(尽管 __sync 版本具有多个编译器实现它们的优势)。

标签: c assembly gcc atomic


【解决方案1】:

对于一些盲目的设置,sync_fetch_and_orsync_or_and_fetch 似乎都同样好,编译器知道优化它的结果被丢弃。 在 x86 上,gcc 不会使用 bts,而是会简单地使用 lock or,这应该没问题。

【讨论】:

  • gcc-10.1 为 atomic<unsigned>::fetch_or(bits, mo_relaxed) 发出 lock bts
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 2013-12-04
相关资源
最近更新 更多