CriticalSection의 linux포팅 - recursive mutex -

윈도우즈에서 lock을 구현하기 위해서 CriticalSection을 사용하고 있었는데 
이걸 linux로 포팅할 일이 생겼습니다 +_+;

일단 mutex를 사용하면 CriticalSection을 구현할 수 있는데요.
InitialzeCriticalSection -> pthread_mutex_init
DeleteCriticalSection -> pthread_mutex_destroy
EnterCriticalSection -> pthread_mutex_lock
LeaveCriticalSection -> pthread_mutex_unlock 
으로 연결이 됩니다.

다만 일반적인 pthread_mutex는 CriticalSection과 달리 한 Thread에서 중첩해서 lock을 걸 수 없습니다. 
CriticalSection에서는 한 Thread에서 CriticalSection에 두번 Enter를 하더라도 Deadlock에 빠지지 않는데 pthread_mutex에서는 그런 경우에 deadlock에 걸리게 됩니다
(처음 윈도우즈 프로그래밍 할 때 deadlock 안 걸린대서 신기했어요 )
즉, 
 pthread_mutex_lock ( &mutex );
 pthread_mutex_lock ( &mutex );
 pthread_mutex_unlock ( &mutex );
 pthread_mutex_unlock ( &mutex );
은 deadlock에 빠지게 되는 거죠

코드를 짜다보면 A라는 함수에서 lock을 걸고 중간에 B라는 함수를 call하는데, B에서는 lock이 걸려 있지 않은 상태에서 call당할 가능성이 있으면 다시 lock을 걸게 되는 경우가 있는데, 그렇게 되면 위와 같은 logic이 발생하게 되는 거죠.

물론, 두번 CriticalSection에 들어가는 것을 방지하는 구현을 할 수도 있겠지만, 그렇게 하려면 이미 구현된 인터페이스를 다 변경해야하는 수고가 들죠;;

라고 알고 있었는데; 이번에 찾아보니 mutex도 recursive 라는 attribute가 있어서 lock 소유자는 다시 lock을 걸 수 있도록 되어있네요 ;;
 pthread_mutexattr_t attr;
 pthread_mutexattr_init ( &attr );
 pthread_mutexattr_settype ( &attr, PTHREAD_MUTEX_RECURSIVE );
 pthread_mutex_init ( &mutex, &attr );

로 mutex init을 하면 lock을 recursive하게 걸 수 있대요

아무래도 공부를 좀 더 해야겠다고 생각중입니다;;
Advanced Programming in the UNIX Environment 라도 좀 봐야겠어요 ㅎㅎ



TAG
서비스 선택
댓글
로그인해주세요.
profile image
powered by SocialXE
Total : 3
  • profile image

    나는 회사에서 APUE랑 TCP/IP 같은 책들 스터디 했었는 데(표지 비슷한 류들...) 팀 사람들이랑 스터디해~ㅎㅎ

    2009.06.06 07:35:36
  • profile image
    흐흐, 저는 그 recursive lock 옵션을 네트웍 1번 플젝하다가 발견했어요. =3=3
    2009.04.04 23:11:47