Windows 用の C++ でプリミティブ データ型の学習演習として、非常に軽量なアトミック ラッパーを実装しています。代入演算子の実装についていくつか簡単な質問があります。以下の 2 つの実装を検討してください。
// 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クラスがそれをメンバーとして持っていると仮定します。
- スレッドセーフな代入演算子が
_InterlockedExchange
必要ですか、それとも単純な実装でスレッドセーフを保証するのに十分ですか? - 単純な代入がスレッドセーフである場合、このクラスの代入演算子を実装する必要さえありますか? コンパイラのデフォルトで十分ですよね?
- 単純な割り当てが Windows でスレッドセーフである場合、他のプラットフォームでもスレッドセーフですか?
_InterlockedExchange
他のプラットフォームでスレッドの安全性を保証するために必要なものはありますか?