【发布时间】: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 版本具有多个编译器实现它们的优势)。