도움받은 사이트 : http://blog.naver.com/dolzzo/130131251201
뭔가 간단한 프로그램을 짜고 있는데 프로그램 종료할 때마다 segmentation fault 가 뜨길래
디버깅해보니 육안상 이상이 없었다.
gdb 로 코어 뜨고 한참을 삽질한 끝에야 원인을 찾을 수 있었다.
나처럼 조인시위키 (https://www.joinc.co.kr/w/man/3/pthread_join) 를 통해 쓰레드를 익혔으면
아래 형태를 많이 봤을 것이다.
int status ;
pthread_join(thread, (void**)&status) ;
이 코드가 32bits OS 에선 이상이 없는데 64 bits OS 로 넘어오면서 문제를 일으킨다.
sizeof(void**) 값은 8인데 여기에 4Bytes 짜리 int 타입의 변수를 넣었기 때문에 메모리 충돌을 일으킨 것이다.
(64bits Linux 로 넘어온지 3년쯤 되는데 그동안 왜 아무일 없었던거지?)
해결책으론 아래와 같이 int 대신 long 을 쓰거나,
long status ;
아니면 아예 void* 로 선언하는 경우가 있겠다.
(앞으론 아래처럼 써야겠다.)
void* status ;
pthread_join(thread, &status) ;
참고로, 정보문화사의 Beginning Linux Programming (3판) 의 예제를 보면
아래와 같이 status 값을 확인하고 있다.
printf("status : %s\n", (char*)status) ;
'삽질미학 > C,C++' 카테고리의 다른 글
[Linux C++] 메시지큐 기반 task 처리하기 (0) | 2017.06.16 |
---|---|
fd_set 구조체 값을 변경시키는 select 함수 (4) | 2017.06.16 |
[C++]초딩 1학년용 덧셈뺄셈 예제 만들기 (0) | 2017.05.31 |
[Linux/C++] TCP Server-Client 연결 예제 (0) | 2017.03.30 |
유니코드(Unicode)를 UTF-8로 변환하기 (0) | 2017.03.30 |