Systems/Unix / Linux2010.07.13 11:20
Mac OS X에서 pthread_t 타입은 opaque 타입이다. 간단하게 말하면, int나 uint32_t와 같은 간단한 타입이 아니라, 그 내부 구조에 의존적인 프로그래밍을 하면 안되는 구조체 타입이라는 뜻이다.

보통은 그렇다고 해서 문제가 생길 일은 없는데, 멀티 쓰레드 디버깅을 하려다 보면 문제가 간혹 불거질 때가 있다. 가령 보통의 Unix 플랫폼에서는 다음과 같은 디버깅 매크로를 작성하면 원하는 위치에서 내가 살펴보고자 하는 정보를 화면에 찍어 볼 수가 있다.

#define DUMP(PRNSTR,...)  printf( \
 "dumping   [%08u,%s,%04d] " #PRNSTR "\n", \
 (uint32_t)pthread_self(), __FILE__,__LINE__,__VA_ARGS__)

그러니까 무슨 말인고 하니, 다음과 같이 하면 꼭 printf 하듯이 필요한 정보를 화면에 찍을 수 있다는 소리이다.

DUMP("%d", int_variable);

그러면 화면에 쓰레드 아이디, 파일 이름, 라인 넘버까지 포함된 디버깅 정보가 쭉 찍힌다.

그런데 Mac OS X에서 pthread_self()가 반환하는 pthread_t 값은 opaque타입이기 때문에 uint32_t 타입으로 캐스팅 하려는 시도 자체가 아예 불가능하다. -_-

그래서 다음과 같은 꽁수를 써야 한다. (대체 뭐하는 짓인지...)

#define DUMP(PRNSTR,...)  printf( \
 "dumping   [%08ld,%s,%04d] " #PRNSTR "\n", \
 pthread_self()->__sig, __FILE__,__LINE__,__VA_ARGS__)

WIN32 환경이라면 다음과 같이 해야 할 것이다.

#define DUMP(PRNSTR,...)  printf( \
 "dumping   [%05d,%s,%04d] " #PRNSTR "\n", \
 GetCurrentThreadId(), __FILE__,__LINE__,__VA_ARGS__)

UNIX 소스를 Mac OS X, Win32에까지 신경써서 포팅하려면 실제 코드 말고도 이런 디버깅 매크로에까지, 신경써줘야 할 것들이 무지 많다.

- - -

최근에 이런 짓을 하면서 살다 보니, 인생이 피곤할 뿐 아니라 손가락도 저리다. 잡문 "프로그래머"는 지금 3부 2절까지 완결된 상태이다. 12절까지 작성되면 출판사로 넘겨드릴 생각인데 과연 받아주실 지는 불투명하다는... (내가 봐도 영 구려서.. ㅋㅋ)

신고
Posted by 이병준

소중한 의견, 감사합니다. ^^