gpt4 book ai didi

c++ - c++ operator |= atomic 是多核处理器吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:22:56 27 4
gpt4 key购买 nike

我目前正在与另一位开发人员争论,他向我保证以下 c++ 语句是原子的:

x |= 0x1; // x is shared by multiple threads

在 Release模式下用 VC++11 编译生成以下程序集:

01121270  or          dword ptr ds:[1124430h],1

另一个开发者说位操作是原子的,因此是线程安全的。我对英特尔 i7 处理器的体验与此相反。

我认为对于多核处理器,任何共享内存写入都是不安全的,因为有单独的处理器缓存。但经过更多研究后,似乎 x86 处理器提供了一些与处理器/内核之间的内存操作顺序相关的保证,这表明它应该是安全的......同样,这不是根据我的经验,情况似乎是这样。

由于我没有关于这类事情的权威知识,所以我很难提出我的理由,甚至很难相信我是对的。

最佳答案

不,它绝对不能保证是原子的。是否使用可中断指令(序列)来实现取决于编译器和平台。但是从标准的角度来看,它不是原子的;因此,如果一个线程执行 x |= 0x1; 而另一个线程访问 x 而中间没有同步点,则它是未定义的行为(数据竞争)。

来自 C++11 的支持引述:

1.10/5:

The library defines a number of atomic operations (Clause 29) and operations on mutexes (Clause 30) that are specially identified as synchronization operations. ...

第 29 条介绍了 std::atomic 和相关函数。它没有将基本类型指定为原子类型。

1.10/21:

The execution of a program contains a data race if it contains two conflicting actions in different threads, at least one of which is not atomic, and neither happens before the other. Any such data race results in undefined behavior. ...

关于c++ - c++ operator |= atomic 是多核处理器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29099094/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com