저는 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;
}
mValue
가 올바른 타입이라고 가정하고
원자 클래스 멤버로 가지고, 아래 두 가지 구현 예를 고려한다.
- 스레드 안전성 할당 연산자에 대해
_InterlockedExchange
이 필요합니까? 아니면 스레드 안전성을 보장 할만큼 간단한 구현입니까? - 간단한 할당이 스레드로부터 안전하다면이 클래스에 대입 연산자를 구현해야 할 필요가 있습니까? 컴파일러 기본값으로 충분합니까?
- 단순 할당이 Windows에서 스레드로부터 안전하면 다른 플랫폼에서도 스레드로부터 안전합니까? 다른 플랫폼에서 스레드 안전을 보장하려면
_InterlockedExchange
에 해당합니까? 상기Atomic
오브젝트가 정렬되는 방법에 의존mValue
의 크기 및 배향에 의존
이러한 조건이 사실이 아닐 경우,'_InterlockedExchange' (또는 다른 시스템에서 이에 상응하는 것)이 필요하거나 더 적합한 원자 함수가 있습니까? – Zeenobit
보다 적합한 것은'std :: atomic'뿐입니다. –
해당 조건이 참이 아닌 경우, * 조건 *에 따라 다릅니다. '_InterlockedExchange'는 마법이 아닙니다. 원자 적으로 보장되는 CPU 특정 명령어에 대한 래퍼입니다. 그러한 지시가 존재하지 않으면,'_InterlockedExchange'가 그것에 대해 할 수있는 것이 아무것도 없습니다 – jalf