[C] pthread 종료시 주의할 점 (SEGFAULT) Develop Tip

다음과 같은 간단한 쓰레드 프로그램이 있습니다.
다른건 중요하지 않고 pthread_create와 
pthread_join 을 보시면 됩니다.


//========================================================================================
void * lL_add_file_start(int num_ndx, void ** logls, int* ndx_types,
const char *ndxfile, char field_delimiter)
{
add_from_file_HD * afft = (add_from_file_HD *)calloc(1, sizeof(add_from_file_HD));
afft->num_ndx = num_ndx;
for (int i = 0; i < num_ndx; ++i) {
afft->pms[i].logl = logls[i];
afft->pms[i].ndxfile = ndxfile;
afft->pms[i].field_type = ndx_types[i];
afft->pms[i].field_delimiter = field_delimiter;
pthread_create(&afft->pms[i].th, NULL, t_add_from_file, &afft->pms[i]);
}
return afft;
}

//========================================================================================
uint64 lL_add_file_end(void * _afft)
{
//int status;
void *status;
add_from_file_HD * afft = (add_from_file_HD *)_afft;
uint64 ndxs_end_id = 0;
for (int i = 0; i < afft->num_ndx; ++i) {
pthread_join(afft->pms[i].th, (void**)&status);
if (ndxs_end_id < afft->pms[i].ndx_end_id)
ndxs_end_id = afft->pms[i].ndx_end_id;
}
return ndxs_end_id;
}

pthread_join을 할 때 int로 선언한 int status를
pthread_join의 두번째 인자로 넣어주면 segfault 에러가 발생합니다.
(많은 샘플에는 이렇게 나와 있더군요)
void * 로 status를 선언해 주어야 합니다.

어느 분께는 도움이 되셨기를...

덧글

  • 안천사 2017/05/30 14:53 # 삭제 답글

    32bit 시스템에서는 int로 써도 무방하나, 64bit 시스템에서는 자료형 크기가 달라지기 때문에 발생하는 문제인 것 같습니다.
    그것도 간헐적으로 발생하는 문제인 것 같아 좀 애매하긴 하지만, 영향을 받지 않으려면 void *를 쓰는 것이 좋겠네요.
  • 지훈현서아빠 2017/05/30 16:33 #

    음... 그런가요?
    좋은 정보 감사합니다.
댓글 입력 영역

구글애드텍스트