【问题标题】:Expressions in gcc atomic operatorsgcc 原子操作符中的表达式
【发布时间】:2010-11-23 19:02:28
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: gcc atomic


    【解决方案1】:

    必须在启动 __sync_fetch_and_or() 操作之前计算表达式 set ? 2 &lt;&lt; nr : 0。所以对addr 的获取和访问将是原子的——没问题。

    要明确一点 - 对addr 指向的内存的读取/修改/写入操作将以原子方式发生 - 对要进行或运算的值的评估将不是原子的(但它不需要是)。

    【讨论】:

    • 那么首先计算表达式,然后是原子操作?这就是我认为会发生的事情,但最好有一些确认。谢谢!
    【解决方案2】:

    你的函数将等同于这个函数(它们甚至可能编译成完全相同的代码):

    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 将自动执行。您可能希望将您的功能更改为如下所示,以便追随您的人不会感到困惑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 2019-09-21
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      相关资源
      最近更新 更多