[완료]연산자 오버로딩과 MS 의 __try, __finally 구문
글쓴이: jeongheumjo / 작성시간: 목, 2011/03/17 - 2:43오후
윈도우의 __try, __finally 구문과 C++ 의 연산자 오버로딩 관련한 질문을 하고싶습니다.
윈도우 질문을 해서 죄송합니다... __;
연산자 오버로딩 관련해서 궁금한 점이 있습니다.
아래 클래스 MessengerTable 와 같은 배열을 크리티컬 섹션으로 관리하는 클래스를 만들었습니다.
그리고 배열클래스답게 인덱스 연산자 오버로딩을 하였습니다.
class MessengerTable { Messenger m_aMessenger[NUM_OF_WORKERS]; CRITICAL_SECTION m_hCSMSSNGR_A; public: MessengerTable(void) { InitializeCriticalSection( &m_hCSMSSNGR_A ); } ~MessengerTable(void) { DeleteCriticalSection( &m_hCSMSSNGR_A ); } Messenger& operator[](const int& _nIdx) { __try { EnterCriticalSection( &m_hCSMSSNGR_A ); return m_aMessenger[_nIdx]; } __finally { LeaveCriticalSection( &m_hCSMSSNGR_A ); } } } theMessengerTable;
그런데 아래와 같이 오버로딩한 인덱스 연산자를 사용하려니 LeaveCriticalSection 이 수행되는 시점이 언제인지 알 수 없어져서... 이렇게 코딩해도 되는가 확인이 필요해졌습니다.
theMessengerTable[nIdx] = Messenger(pi.hProcess, nIdx);
C++ 과 MS 의 __try, __finally 구문을 잘 아시는 분께 도움을 요청합니다.
위처럼 대입연산을 했을 때 대입 구문이 마쳐지기 까지 동기화에 문제가 없을 까요?
Forums:
MS의 그 구문은 잘 모르겠지만, 연산자
MS의 그 구문은 잘 모르겠지만, 연산자 오버로딩이라고 다를거 없습니다.
모양만 다를뿐 일반 함수의 호출과 100% 동일합니다.
theMessengerTable[nIdx] = Messenger(pi.hProcess, nIdx);
라는 구문은 operator[]라는 이름의 함수를 호출합니다. 즉,
operator[](nIdx) = Messenger(pi.hProcess, nIdx);
라고 적은 것과 같습니다.
그렇다면 저처럼 코딩하면 안되겠네요..
대입연산은 함수 operator[](nIdx) 의 수행 이후에 이루어질 텐데, 함수 수행 이후에는 뮤택스 락이 풀린 다음이니까요...
감사합니다. ^^*
댓글 달기