DCLP에 대한 고찰이 맘에 들었던 자료하나를 찾았다. 예전부터 Singleton 패턴을 구현할때 DCLP부분이 늘 애매했었는데, 보다 깊은 이해를 할 수 있도록 가이드를 해줄만한 썩 괜찮은 내용이다.

DCLP_DDJ_Jul_Aug_2004_revised.pdf

개략적으로 살펴보면 이렇다.


전형적인 싱글톤 패턴을 구현하는 C++ code. 싱글프로세서 기반에서는 적절하다.


멀티프로세서 기반에서는 쓰레드안전하게 하기위해서 흔히들 이중으로 확인하는 Double-checked Locking Pattern을 사용하는 코드가 사용된다. 문제점이야 여전히 남아있지만서도.

그래서 사용되는 것이 volatile이라는 한정지시자를 사용한다.

완벽해보이지만, 여전히 컴파일러에 따라 최적화 로직 차이가 있음으로 인해 문제가 발생할 수 있다는 의견이 있다. 그래서 Memory Barrier를 두어 보다 안전하게 코드를 작성한다.


But, DCLP is broken....Never use it!!


Posted by Jason Ryu
,

헷갈리는것이 아니라 모르고있는거라니까.


< const 키워드 >


1. 클래스 내부에 const 멤버 변수가 있는데 생성자를 만들지 않으면 컴파일 에러(C2512)가 난다. 

생성자에서 멤버 이니셜라이저(member initialize)를 이용해서 초기화를 해주지 않으면 어떤곳에서도 그 멤버를 변경 시킬수 없기 때문이다.


2. const int ntest = 10; // 변수 ntest를 상수화 시켜서 변화불가능하게 만든다.



3. const int* ptest;  // 포인터 ptest가 '가리키는' 데이타를 ptest를 통해서 변경하지 못하게 만든다.



4. int* const ptest;  // 포인터 ptest를 상수화 시켜서 변화 불가능하게 만든다. 한번 가리킨 곳은 변경하지 못한다.

 


5. int getdata() const;  // 이 멤버 함수 에서는 멤버 변수를 변경시킬수 없다.

    // 또한 멤버 변수의 포인터를 return 할수도 없다.( 리턴형이 포인터 일때 )


6. void setdata( const int data ); // 인자로 넘어가는 data를 함수 내부에서 변경 시킬수 없다.


7. void setdata( const int* data ); // 함수 내부에서 *data = 10; 이런식의 변경이 불가 하다.


8. void setdata( int* const data ); // 함수 내부에서 data = &data1; 이런식으로 포인터 변경이 불가하다.


9. void setdata( const int* const data ); // 6,7 의 속성을 모두 같게 된다.


10. 객체를 상수화 해서 선언할 경우 상수화 되지 않은 함수의 호출,

멤버변수의 포인터를 리턴 하는 행위를 허용하지 않는다.


11. 상수 함수냐 아니냐에 따라서 함수는 오버로딩이 가능하다.

오버로딩된 함수를 사용할때 특별한 지정이 없으면 비상수 함수가 우선순위가 높다.

둘다 호출이 가능한 상황에서는 비상수 함수가 호출 된다는 뜻이다.

  

12. const int getdata(); // 이건 의미 없다. 상수를 다시 상수화 시키는게 무슨 의미가 있단 말인가.


13. const int* getdata(); // 12번은 의미가 없지만 함수나 멤버 변수의 포인터를 리턴할때 함수를 이용해서 멤버 변수의 조작이 가능하기 때문에 함수를 통한 조작을 막을수 있다.



Posted by Jason Ryu
,



'$ SaVvY > » computer' 카테고리의 다른 글

Recursive Function.  (0) 2013.07.10
Pyhon 2.7.3 with Xcode 4  (0) 2013.07.10
문자열검색 알고리즘. KMP  (0) 2013.07.10
Building ACE framework on Mac OS X Mountain Lion.  (0) 2013.07.10
Public DNS server  (0) 2013.07.10
Posted by Jason Ryu
,