2012-02-21 4 views
1

원자의 정수를 나타내는 래퍼가 있습니다. 내부적으로, 그것은 volatile long 변수하려면 Windows 'InterlockedIncrement()InterlockedDecrement() 기능을 사용하여 구현됩니다휘발성 멤버에 대한 액세스 방법

class AtomicInt { 
public: 
    ... 

    operator long() const { return m_value; } 

private: 
    volatile long m_value; 
}; 

내 질문입니다, 정확한 현재 값을 쿼리에 대해 위의 연산자 (즉, 당신은 항상 현재의 값을 얻을) 또는 캐시 된 값에 문제가 발생하지 않도록하려면 메서드를 volatile으로 선언해야합니까?

답변

2

당신이 한 일은 훌륭합니다 ...이 방법을 휘발성으로 표시 할 필요는 없습니다. 또한 클래스 선언에 메서드의 정의를 포함 했으므로 메서드는 일반적으로 컴파일러에서 암시 적으로 인라인되므로 컴파일러 최적화 프로세스 중에 실제 함수 호출 메커니즘이 생략됩니다. 따라서 대부분의 상황에서 변수 자체는 함수 호출없이 직접 액세스되어 변수에 대한 volatile 선언을 충분히 만듭니다.

향후 추후에 x86 외부의 다중 프로세서 환경에서 volatile 키워드만으로는 공유 메모리 값을 사용하는 스레드가 캐시 된 데이터를 수신하지 못하는 것을 확인할 수 있습니다. 일반적으로 volatile 키워드는 특정 컴파일러 최적화를 막지 못합니다. 그러나 메모리 일관성 규칙 (예 : ARM, PowerPC 등)이 약한 프로세서 플랫폼에서는 변수가 휘발성으로 표시된 경우에도 로컬 프로세서 코어에서 캐시 된 값에 액세스 할 수 있습니다. 이 문제를 해결하는 방법은 적절한 메모리 장벽을 구현하여 실제 프로세서 메모리 캐시의 오래된 값이 플러시되고 새로 고쳐지는지 확인하는 것입니다. 물론 플랫폼에 종속적 인 지침입니다. 좋은 경우는 사용중인 컴파일러 내장 함수가 AtomicInt 클래스에서 이러한 문제에 직면하지 않는다고 확신하지만이 사실을 사용자에게 알리고 싶습니다. volatile 키워드와 관련된 일반적인 문제입니다.

+0

여기서 휘발성은 마이크로 소프트의 추가 의미를 전달한다고 가정합니다. –

+0

예, MSVC의 '휘발성'해석은 실제의 의미와 '휘발성'의 목적에 대한 혼란을 더합니다 ... BTW, 메모리 장벽을 추가하는 동안 Itanium은 '휘발성 (volatile)'으로 WOA (Windows on ARM)에서도 똑같이 할 것인가? – Jason

+0

음, 확실하지는 않지만 일부 플랫폼에서는 '휘발성'이 약 해지면 놀랄 것입니다. –

0

m_value 휘발성으로 충분합니다. 이는 최적화 된 액세스 방법을 중단시키는 데 충분합니다.

관련 문제