pthread 와 Invalid Handle 값?
글쓴이: shkim / 작성시간: 목, 2008/08/07 - 4:00오전
pthread_t 와 ~cond_t, ~mutex_t 세개의 타입을 쓰는데요,
C++ 클래스의 멤버 변수로 썼어요.
클래스를 만들때, 생성자에는 초기화되지 않은 값으로 셋팅하고
Create() 메소드에서 초기화 한 후
Destroy() 메소드에서 해제하고 핸들을 초기화되지 않은 값으로 다시 셋팅하고
파괴자(destructor) 에서 해제를 했나 검사를 합니다..
뻔한 스토리죠?
Win32 에서는 HANDLE 변수에 INVALID_HANDLE_VALUE 라는 값을 넣음으로 위 작업을 할 수 있었습니다.
그런데 pthread*_t 에서는 INVALID_HANDLE_VALUE 에 대응하는 뭔가가 뭔지 모르겟습니다 !!
일단.. 컴파일러가 에러를 내서 다음과 같이는 쓸 수 없더군요.
MyEvent::MyEvent()
{
m_mutex = PTHREAD_MUTEX_INITIALIZER;
m_cond = PTHREAD_COND_INITIALIZER;
}
리턴값을 던질 수 없는 생성자에서 pthread_mutex_init 등을 호출하고 싶지는 않습니다.
저는 try/catch 를 싫어하거든요;;
현재로서는 다른 변수를 두어 pthread 관련 변수들이 초기화 되었는지를 기록하고 있습니다만
메모리 낭비 같습니다.
뭔가 좋은 방법 없을까요???
Forums:
/usr/include/pthread.h /usr/include/bits/pthreadtypes.h
이니셜라이져가 왜 안될까요?? 소스함 보세요
포탈이는 불사신
-------------
포탈이는 불사신
장난하나요?
소스를 보면 없는 답이 생깁니까? 포탈이는 불사신? 이건 또 무슨 소린지.. -_-
여기 쟁쟁한 분들도 많은데 제가 C 기초 문법 설명해야 하나요?
함수 밖에서 struct 변수에 { ... } 로 선언하며 값 셋팅하는 것이 ~INITIALIZER 입니다.
함수 내부에서 변수에 값을 대입하는 용도로 쓰려면 컴파일 에러를 내죠.
님이나 헤더 파일 소스 똑바로 보고 낄데인지 안낄데인지 생각 좀 해보시죠.
제 댓글이 이런 대답을...
낄데 안낄데...먼가 죄송한 일을 한것 같은데 먼질 몰겠네요.
소스를 보는게 C기초인지는 잘 모르겠습니다만
이니셜라이져가 하는 짓거리가 초기화(소스를 따라가면 다 '0'으로 초기화 시킵니다)임으로
정말 하고 싶으시면 다 0으로 채우시면 되겠다 싶었고(걍 memset으로)...
포인터형을 쓰시면 걍 간단하게 널포인터 주고 start, cleanup 구현하고 싶은대로 하심 될것 같네요.
기분이 참 우울하네요.
포탈이는 불사신
-------------
포탈이는 불사신
기분 나빴다면 죄송합니다.
한줄로, 헤더 파일 소스 봐라~ 라고 답글 단 것이 저도 썩 기분 좋지는 않았습니다.
그런데 흔히 이런 opaque handle 이라는 것은 내부를 봐도 못본것으로 해야 합니다.
그렇기 때문에 헤더 보고 sizeof(struct) 만큼 0 으로 memset 하는 것은
포팅을 생각한다면 절대로 하면 안되는 일입니다.
실제로 Win32 용 pthread 헤더를 보면 완전히 다르게 구현되어 있습니다.
그런 거 없지 않나 싶군요.
pthread 공부할 때 그런 거 기억이 안나는군요.
그리고 쟁쟁한 사람들이 누군지는 모르겠습니다만 겸손은 자기 자신부터 찾는게 좋다고 봅니다.
댓글 달기