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类将其作为成员.
_InterlockedExchange需要线程安全的赋值运算符,或者是否足以保证线程安全的简单实现?_InterlockedExchange保证其他平台上的线程安全性?如果 mValue是基本类型(和至多32个位宽为32位的CPU,至多64个位宽一个64位CPU上),并且你一个x86 CPU(在32或64位模式)上运行,并如果不手动错位数据,则内存读/写保证是原子的.
这本身并不意味着编译器不会重新排序内存访问,甚至不会完全优化它,但CPU确实保证任何良好对齐的读/写与这些大小的数据都是原子的.
但请注意,我所说的是原子性,而不是线程安全性,因为"线程安全"取决于使用代码的上下文.
| 归档时间: |
|
| 查看次数: |
1645 次 |
| 最近记录: |