c++ - 原子赋值运算符

标签 c++ winapi atomic assignment-operator

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

// 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;
}

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

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

最佳答案

如果 mValue 是基本类型(在 32 位 CPU 上最多 32 位宽,在 64 位 CPU 上最多 64 位宽), 并且您在 x86 CPU 上运行(在 32 或 64 位模式下)并且您没有手动错位数据,然后内存读取/写入保证是原子的。

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

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

关于c++ - 原子赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17526394/

相关文章:

c++ - 从 C++ 程序读取和设置组策略设置

wpf - 确保 WPF 窗口始终位于顶部,即使用户单击另一个最大化的应用程序也是如此

python - 如何在 Windows 上最大化窗口并禁用调整大小而不覆盖任务栏 - tkinter/tk-toolkit

mysql - 将编辑控件值与 mysql 数据库值进行比较

ios - iOS 上的 Metal 原子操作性能

c - 一个作者,多个读者在无锁应用中

c++ - while 循环不适用于第二个循环

c++ - 哪些虚拟指针值是可以的

c++ - 使用 g++ 在不同文件夹中创建带有 .o 文件的可执行文件时出现问题

c++ - 理解 C++11 中的 std::atomic::compare_exchange_weak()