【问题标题】:Are C++11 compilers allowed to introduce additional loads of atomic variables?是否允许 C++11 编译器引入额外的原子变量负载?
【发布时间】:2013-08-26 05:05:23
【问题描述】:

this answer 中,bdonlan 声明代码类似于以下内容:

int t;
volatile int a, b;

t = x;
a = t;
b = t;

可能被编译器转换成:

a = x;
b = x;

我的问题是,如果x 是具有宽松负载的原子变量,是否仍然允许这样做,如下所示?

atomic<int> x;

int t;
volatile int a, b;

t = x.load(std::memory_order_relaxed);
a = t;
b = t;
assert(a == b);    // Will this hold?

正如标题所说,C++11 编译器是否允许引入额外的原子变量负载?额外的商店呢?

【问题讨论】:

  • 允许编译器在as-if规则下做任何事情。编译器必须表明没有其他线程可以访问同一个变量
  • @Vaughn:嗯,那么这是否意味着 bdonlan 的答案中的第一个示例不会发生?而且,我认为 as-if 规则仅适用于单个线程? (我弄错了吗?)编译器不断地让我惊讶!
  • @Cameron:如果另一个线程修改了非原子x 值,则读取它会在该线程上调用未定义的行为,因为该线程不与它同步。所以你可以得到任何东西,包括链接答案中的行为。
  • @Nicol:啊,我明白了,谢谢。但是第二个例子呢?标准说宽松的原子操作不是同步操作——这有什么关系吗?
  • @Cameron 标准规定宽松的原子操作不是同步操作 - 没错,但这只会影响写入t 的值。无论该值是什么,您都可以确保将相同的值写入ab(假设abt 只能由同一个线程访问)

标签: multithreading c++11 memory-model


【解决方案1】:

允许编译器在 as-if 规则下做任何事情,但是要加载相同的内存位置两次,编译器必须表明没有其他线程可以访问相同的变量。无论哪种方式,您都可以保证在您的示例中使用 a==b

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 2021-04-06
    • 1970-01-01
    • 2011-03-29
    • 2017-06-08
    • 2015-02-28
    • 1970-01-01
    相关资源
    最近更新 更多