pthread_mutexattr_settype 에 관하여
글쓴이: osanha / 작성시간: 수, 2008/12/10 - 3:33오전
Gentoo linux, gcc 4.1.2, nptl 환경입니다.
pthread_mutex_lock내에서 pthread_mutex_trylock 을 써야 하는 상황이 있어.
mutex를 PTHREAD_MUTEX_RECURSIVE 타입으로 생성할려고 하는데..
pthread_mutexattr_settype 함수의 원형 및 PTHREAD_MUTEX_RECURSIVE 정의가 없다고 나옵니다.
pthread.h 헤드파일을 보면 #ifdef __USE_UNIX98 안에 들어가 있어서
그것을 define 했는데도 계속 못찾군요..
solaris 나 hp-ux에서는
PTHREAD_MUTEX_RECURSIVE 를 이용한 pthread_mutexattr_settype 사용에 있어 아무 문제가 없습니다.
리눅스의 man page를 봐도 특별한 note도 없는데 말이죠...
어쩌면 NTPL 환경이라서 그런것 같습니다.
pthread.h 헤드를 보면 PTHREAD_MUTEX_RECURSIVE_NP 정의가 있기 때문이죠.
우선 그것을 사용해서 테스트해본 바 의도했던대로 동작은 하는군요.
허나 이기종간 이식성을 위해 #ifdef 구문을 사용할려고 하는데 무엇을 define으로 찾아야 할지 모르겠군요
관련해서 조언바랍니다.
Forums:
http://man.kldp.org/wiki/ManP
http://man.kldp.org/wiki/ManPage/pthread_mutexattr_init.3 를 보니..
아래와 같은 구문이 있군요.
헌데, 왜 man 에서는 pthread_mutexattr_setkind_np 는 없고 POSIX 표준인 pthread_mutexattr_settype 이 나오는걸까요. 아무런 note도 없이..
또한, 헤드파일에 분명 __USE_UNIX98 을 define하면 표준 함수를 쓸 수 있는걸로 보이는데 정의를 넣어도 안되는 이유를 모르겠군요.
흠.. c 파일에서 h
흠..
c 파일에서 h 파일 include 하기전에 아래와 같이해서 pthread_mutexattr_settype 등을 원형을 불러올 수 있게 되긴 합니다만,
gcc 컴파일 옵션에서 -D 를 이용한 정의에서는 먹히지 않는군요. 어디선가 undef 를 하는걸까요.
여하튼, 전체를 __USE_UNIX98로 정의하는것보다는 상기 코드처럼 필요한 소스내에서만 하는게 더 좋다고 생각은 드네요.
대부분의 헤더
대부분의 헤더 상단에서 인클루드 하고 있는 features.h 에서 여러가지 심볼들을 처리하더군요.
미리 모든 심볼들을 undef 한 후에 다시 재정립 하는 방식이며 pthread.h에서도 이것을 인클루드 하고 있구요.
결론적으로,
__USE_UNIX98 이 포함될려면 _XOPEN_SOURCE 가 500이상의 값을 가지면 되는데.
이는 또한, _GNU_SOURCE 를 정의하면 대부분의 심볼들이 정의되는군요. _XOPEN_SOURCE는 600으로 설정되구요.
따라서,
gcc 옵션에서 -D_GNU_SOURCE 또는, -D_XOPEN_SOURCE=500 또는, -D_XOPEN_SOURCE=600 을 추가하면 됩니다.
댓글 달기