gcc原子运算符中的表达式

时间:2010-11-23 19:02:29

标签: gcc atomicity

任何人都知道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);
}

谢谢!

2 个答案:

答案 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将以原子方式执行。您可能希望将您的功能更改为这样,以便追随您的人不会感到困惑。