代码之家  ›  专栏  ›  技术社区  ›  Antoine Morrier

混合原子和非原子变量和缓存

  •  0
  • Antoine Morrier  · 技术社区  · 7 年前

    假设我们有一段代码,它是正确的(至少我希望如此):

    std::atomic<int> a;
    std::atomic<bool> ready{false};
    void threadA() {
        a.store(666, std::memory_order_relaxed);
        ready.store(true, std::memory_order_release);
    }
    
    void threadB() {
        while(!ready.load(std::memory_order_acquire));
        process(a.load(std::memory_order_relaxed));
    }
    

    int a; 而不是 std::atomic<int> a; ,也正确吗?或者是否存在缓存刷新/失效问题?

    1 回复  |  直到 7 年前
        1
  •  1
  •   LWimsey    7 年前

    不管这是不是一个好主意,例如,您的代码很好。。

    您可以替换原子类型的 a int
    C++标准用以下短语(§1.10.1-6)支持您的情况:

    自从 threadB 加载的值 ready 存储人 threadA (它正在循环中等待它) 与同步 关系已建立。 因此 a.load() a.store() . 另一种说法是 发生在之前