class Pig : public Singleton<Pig>
{
...
}
이런식으로 상속받아서 사용하는데
단일 인스턴스를 처음에 static으로 생성하면 문제가 되는 게 있어?
종종 싱글턴 패턴 예제를 보면 new로 인스턴스를 저장하는 모습을 많이 봐서
문제가 될까해서 그냥...
차이가 있다면 static T _inst;를 하면 프로그램이 생성되자마자 메모리의 데이터 영역에 인스턴스가 생성되고
static T* _inst로 하면 메모리를 힙 영역에 할당해서 쓸 수 있다는 차이 말고는 없잖아...
{
...
}
이런식으로 상속받아서 사용하는데
단일 인스턴스를 처음에 static으로 생성하면 문제가 되는 게 있어?
종종 싱글턴 패턴 예제를 보면 new로 인스턴스를 저장하는 모습을 많이 봐서
문제가 될까해서 그냥...
차이가 있다면 static T _inst;를 하면 프로그램이 생성되자마자 메모리의 데이터 영역에 인스턴스가 생성되고
static T* _inst로 하면 메모리를 힙 영역에 할당해서 쓸 수 있다는 차이 말고는 없잖아...
언제 생성될지를 정할 수 있으니까.
지역 static 변수는 함수가 호출될떄 생성되는거 아닌가
그래서 결국 싱글턴 인스턴스를 반환하는 함수가 호출되기 전에는 객체 생성이 안될텐데
http://codepad.org/rfn4UH6o
둘 이상의 쓰레드에서 동시에 첫 get_instance() 를 호출하는 상황이 되면 쓰레드쎄이프하다고 얘기하기 힘들 것 같다
double checked idiom도 쓰레드세이프하지 않다고하는데 그건 구글링 ㄱㄱ
static이면 생성 소멸 시점이 지멋대로...인것?... //더블체크가 세이프하지 않다는건 애초에 lock 해주는 명령어에 문제있는거 아님?
더블체크가 세이프하지 않은건 singleton *instance = new singleton(); 이 문장이 실행될때, 1. 메모리를 할당하고 2. 생성자를 호출하고 3.포인터에 주소를 대입 하는 과정대로 실행되면 좋지만 실제로는 2번과 3번의 순서가 바뀔 수 있기 때문에 안전하지 않다는것이 요지
할단전에 락걸고 들어와잇는상태니 안전하지안나... [파워 넥스]
http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf
영어지만 차근차근 읽어보면 뭐가 문제인지 금방 이해될 거임
c++ 문제인거 같은데?,,자바나 씨샵에서는 싱크로나, lock으로 하자나.. 이건 애초에 안으로 접근이 안된다는거고, 설명같이 c++의 경우는 단순이 포인터 값이 0인지 아닌지만 검사하니까,,순서가 바뀌면,,문제가 발생할 수 있다,,이런 내용같은데,,, 맞나요??ㅋ
자바도 메모리 모델 새로 나오기 전까진 똑같은 문제가 있었어. C/C++ 표준 자체가 멀티쓰레드/프로세스에 대한 고려가 없이 만들어진거라 그런데, C++0x 표준엔 메모리 배리어 관련 항목이 있으니(맞나??) 해결되겄지 아마??