任何人都知道gcc对表达式传递的内容作为原子内置函数的值。考虑下面的功能。请问gcc能否保证此操作的原子性? (即使需要额外的周期来计算2 << nr
?
static inline test_and_set_bit(volatile void *addr, int nr, int set) {
__sync_fetch_and_or(addr, set ? 2 << nr : 0);
}
谢谢!
答案 0 :(得分:2)
必须在启动set ? 2 << nr : 0
操作之前评估表达式__sync_fetch_and_or()
。因此,对addr
的获取和/或访问将是原子的 - 没问题。
只是要清楚 - 对addr
所指向的内存的读/修改/写操作将以原子方式发生 - 要对其进行的值的评估将不是原子的(但它不是'需要)。
答案 1 :(得分:1)
你的函数将等同于这个函数(它们甚至可能编译成完全相同的代码):
static inline test_and_set_bit(volatile void *addr, int nr, int set) {
const int bit = set ? 2 << nr : 0;
__sync_fetch_and_or(addr, bit);
}
表达式不会被“原子地”评估,但因为它涉及所有不相关的局部变量。 __sync_fetch_and_or
将以原子方式执行。您可能希望将您的功能更改为这样,以便追随您的人不会感到困惑。