原子分配操作员

Zee*_*bit 2 c++ winapi atomic assignment-operator

我正在实现一个非常轻的原子包装器作为C++ for Windows中原始数据类型的学习练习,我有一些关于实现赋值运算符的简单问题.考虑以下两种实现:

// Simple assignment
Atomic& Atomic::operator=(const Atomic& other)
{
    mValue = other.mValue;
    return *this;
}

// Interlocked assignment
Atomic& Atomic::operator=(const Atomic& other)
{
    _InterlockedExchange(&mValue, other.mValue);
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

假设这mValue是正确的类型,并且Atomic类将其作为成员.

  1. 是否_InterlockedExchange需要线程安全的赋值运算符,或者是否足以保证线程安全的简单实现?
  2. 如果简单赋值是线程安全的,那么是否需要为此类实现赋值运算符?编译器默认应该就够了,不是吗?
  3. 如果简单赋值在Windows中是线程安全的,那么它在其他平台中是否也是线程安全的?是否相当于_InterlockedExchange保证其他平台上的线程安全性?

jal*_*alf 7

如果 mValue是基本类型(和至多32个位宽为32位的CPU,至多64个位宽一个64位CPU上),并且你一个x86 CPU(在32或64位模式)上运行,并如果不手动错位数据,内存读/写保证是原子的.

这本身并不意味着编译器不会重新排序内存访问,甚至不会完全优化它,但CPU确实保证任何良好对齐的读/写与这些大小的数据都是原子的.

但请注意,我所说的是原子性,而不是线程安全性,因为"线程安全"取决于使用代码的上下文.