728x90
void _Incref() noexcept { // increment use count
_MT_INCR(_Uses);
}
#define _MT_INCR(x) _INTRIN_RELAXED(_InterlockedIncrement)(reinterpret_cast<volatile long*>(&x))
스마트 포인터의 reference counting은 저 _Uses라는 변수로 관리된다. 그리고 관리를 위해 증가, 감소하는 연산은 _Incref()와 _Decref()로 동작하는데 _Incref()의 _MT_INCR이라는 매크로는 그 아래와 같이 되어있고 보면 _InterlockedIncrement()라는 함수를 사용한다.
내장 함수 _InterlockedIncrement
연동된 증가에 대한 Microsoft C/C++ 컴파일러 내장 함수입니다.
learn.microsoft.com
InterlockedIncrement 함수(winnt.h) - Win32 apps
지정된 32비트 변수의 값을 원자성 연산으로 증분(1씩 증가)합니다.
learn.microsoft.com
MSDN을 보면 InterlockedIncrement()는 원자적인 연산으로 동작한다고 되어있다. 따라서 shared_ptr클래스는 thread safe하다고 할 수 있다. 하지만 shared_ptr 클래스 자체가 thread safe한 것이지 포인터로 객체에 접근해서 이런 저런 변수를 건드리는 것은 thread safe하지 않기 때문에 구분할 필요가 있다.
728x90