입니다. this에 C++의 Double Checked Locking Pattern에 대한 기사가 있습니다. 저자는 volatile
을 사용하여 DCLP를 "올바르게"구현하려는 시도 중 하나를 시연했습니다 (10 페이지). 변수 : 텍스트 조각이C++에서 Double Checked Locking을 구현하는 방법은
class Singleton {
public:
static volatile Singleton* volatile instance();
private:
static volatile Singleton* volatile pInstance;
};
// from the implementation file
volatile Singleton* volatile Singleton::pInstance = 0;
volatile Singleton* volatile Singleton::instance() {
if (pInstance == 0) {
Lock lock;
if (pInstance == 0) {
volatile Singleton* volatile temp = new Singleton;
pInstance = temp;
}
}
return pInstance;
}
예 후는 이해가되지 않는 :
관찰 행동에 표준의 제약이 역으로 정의 추상 기계만을위한 첫째,그 추상 기계 에는 다중 스레드 실행 개념이 없습니다. 재정렬 읽고 휘발성 데이터 내 스레드가, 모든에 같은 reorderings 에서 스레드에서 제약 조건을 부과하지 않습니다에 기록에서 그 결과, 불구하고 표준 컴파일러를 방지 할 수 있습니다. 최소한 컴파일러 구현자가 대부분 해석하는 방법입니다. 결과적으로 실제로 많은 컴파일러가 위 소스에서 스레드 안전하지 않은 코드를 생성 할 수 있습니다.
이상 :
... C++의 추상 기계는 단일 스레드이며, C++ 컴파일러는 어쨌든 위, 같은 소스에서 스레드 안전하지 않은 코드를 생성 할 수도 있습니다.
이러한 설명은 유니 프로세서에서의 실행과 관련되어 있으므로 캐시 일관성 문제는 아닙니다.
순서를 변경할 수 없습니다 컴파일러가 읽고 휘발성 데이터 스레드 내에서 에 쓰는 경우
, 어떻게 할 수는 재주문 읽기 때문에 스레드 안전하지 않은 코드를 생성이 특정 예를 들어 에서 스레드를 쓴다?volatile Singleton* volatile temp = new Singleton;
pInstance = temp;
속으로 :
그 기사는 2004 년 이후로, C++ 11 및 그 업데이트 된 추상 기계보다 상당히 오래된 것입니다. – molbdnilo
@molbdnilo 알았어.하지만 컴파일러가 _across_ 쓰레드를 읽고 쓰는 순서를 어떻게 설명 할 수 있니? – undermind