代码之家  ›  专栏  ›  技术社区  ›  Michael Mior

gcc原子运算符中的表达式

  •  1
  • Michael Mior  · 技术社区  · 14 年前

    任何人都知道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 回复  |  直到 14 年前
        1
  •  2
  •   Michael Burr    14 年前

    表达 set ? 2 << nr : 0 必须在 __sync_fetch_and_or() 操作已启动。因此,获取和/或访问 addr 会是原子的-没问题。

    只是为了清楚-指向内存的读/修改/写操作 地址 将以原子的方式发生-对要计算或要计算的值的计算将不是原子的(但不需要)。

        2
  •  1
  •   Omnifarious    14 年前

    您的函数将等同于此函数(它们甚至可能编译为完全相同的代码):

    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 将以原子方式执行。你可能想把你的功能改成这个样子,这样人们就不会对你感到困惑。

    推荐文章