EnterCriticalSection 사용할때 주의 할점

반응형

출처 : http://blog.naver.com/process3?Redirect=Log&logNo=20026509730

 

CriticalSection 은 vista 에서 데드락에 빠질 수 있습니다. 이 내용에 대해서 말씀 드리는 것은 아니에요

 

[문제 발생 원인]

EnterCriticalSection 의 API 를 MSDN 에서 확인 해 보면 리턴값이 VOID 형 입니다. 즉, 이 함수를 호출한

후에 성공했는지 실패했는지 확인 할 수가 없습니다. 그리고 일반적으로 우리가 사용 할 때도 리턴값을

확인하지 않습니다. 그런데 만약에 시스템에 메모리가 low memory situations 상태 일 때(가용메모리가

부족 할 때) EnterCriticalSection 함수 호출한 곳에서 Exception 이 발생 합니다. 만약에 이럴 경우에는

정말로 찾기 어려운 버그가 발생하는 것입니다.

 

[문제 해결 방법]

1) SEH (structured exception handling) 을 이용 한다.

즉, 예외 처리를 사용하는 것입니다. (SHE 의 자세한 내용은 "갱주니" 님의 블로그를 참조해 주세요.

http://blog.naver.com/process3/20023779161)

 

 

2) InitializeCriticalSection 초기화 함수 대신 InitializeCriticaSectionAndSpinCount 를 사용 한다.

기존에 우리가 사용하던 InitializeCriticalSection 함수 대신에 InitializeCriticalSectionAndSpinCount 를

사용 하면 됩니다.

(InitializeCriticalSectionAndSpinCount 를 사용 하면 이벤트를 미리 할당해 놓고(Preallocate Event)

EnterCriticalSection 을 사용 하기 때문에 문제가 없습니다.)

 

 

[여기서 잠깐 스핀 카운트란?]

스핀 카운트는 다중 프로세서 시스템에서 여러 프로그램이 동시에 같은 리소스를 엑세스 해야 할 때 성능을

높이기 위한 방법 입니다. 스핀 카운트는 프로세서가 기다리기 전에 리소스를 엑세스 하기 위해 시도하는

횟수를 제어 합니다. 명확한 이해를 위해, 서로 다른 프로세서에서 동시에 실행 중인 여러 쿼리를 가진 데이터

베이스 응용 프로그램을 생각 해 보겠습니다. 쿼리 1번이 특정 테이블의 행에 쓰려고 하지만 쿼리 2번이

그 행을 잠궜기 때문에 엑세스가 거부 됩니다. 스핀 카운트가 없다면 쿼리 1번은 쿼리의 수행을 방해 하며

잠시 대기 해야 합니다. 스핀 카운트를 사용 하는 경우 쿼리 1번은 쿼리 2번이 행을 빨리 해제 할 것으로

기대 하면서 쓰기를 몇 회 시도 하면 되며, 모든 시도가 거부 될 경우에만 대기 합니다.

 

다중 프로세서 시스템에서는 여러 프로세스가 동시에 실행 할 수 있기 때문에 이는 다중 프로세서

시스템에서만 유용 합니다. 단일 프로세서 시스템에서 각 프로세스는 다른 프로세스가 어떤 식으로든 실행

되기를 기다려야 하며, 그럴 경우 리소스에 대한 반복적인 엑세스 시도는 다른 프로세스가 실행 기회를 가질

때까지 성공 하지 못합니다.

단일 프로세서 시스템에서 스핀 카운트를 사용 하는 응용 프로그램은 성능이 저하 되지 않지만 얻는 이점도

없습니다.

'Study > C++' 카테고리의 다른 글

__FILE__, __FUNCTION__, __LINE__  (0) 2010.03.25
c++ 생각하기 5.  (0) 2010.03.22
c++ 생각하기 3.  (0) 2010.03.16
winapi의 오류를 문자열로 출력하기.  (0) 2010.03.13
가변 인수를 가지는 함수 및 매크로 만들기  (0) 2010.03.13
TAGS.

Comments