리눅스프로그래밍 초짜입니다 다시 한번 pthread관련 질문을 ㅜㅜ
void *t_function(void *data)
{
int id;
int i = 0;
id = *((int *)data);
while(1)
{
printf("%d : %d\n", id, i);
i++;
sleep(1);
}
}
int main()
{
pthread_t p_thread[2];
int status;
int a = 1;
int b = 2;
pthread_create(&p_thread[0], NULL, t_function, (void *)&a);
// pthread_join(p_thread[0], (void **)&status);
pthread_create(&p_thread[1], NULL, t_function, (void *)&b);
pthread_join(p_thread[0], (void **)&status);
pthread_join(p_thread[1], (void **)&status);
return 0;
}
위의 코드를 실행 시키면 두개의 스레드가 생성되고 각 스레드에서 t_function이 실행이 됩니다
그런데요 지금 pthread_create(&p_thread[1]... 이 함수 밑의 pthread_join 코드를 삭제하고 pthread_create(&p_thread[0],.. 밑의 pthread_join을 주석을 풀고 테스트 해보았습니다
그랬더니 pthread_create(&p_thread[0].. 에 등록된 t_function 함수만 스레드 생성 후 실행을 하더라구요;;;
제가 이부분이 이해가 되지 않습니다
pthread_join함수가 호출이 되면 그 전에 pthread_create에서 등록한 함수가 종료될때까지 블러킹이 되는걸로 이해가 됬는데 pthread_join함수를 나란히 호출하면 어떻게 계속 스레드를 join 시킬수가 있는건지 ㅜㅜㅜ
pthread_join은....
pthread_join은 thread가 종료되기를 기다립니다. thread가 종료되기 위해서는 t_function 함수가 return을 해야합니다.
그런데, t_function 함수는 return을 하지 않고 무한 loop을 돌고 있습니다.
그러므로 pthread_join을 pthread_create(&p_thread[0], NULL, t_function, (void *)&a); 라인 다음에 넣으시면
pthread_join은 thread가 종료되길 계속 기다리고 있습니다.
결론적으로 하나의 thread만 생성되는 것이죠. ( pthread_create(&p_thread[1], NULL, t_function, (void *)&b); 라인은
첫번째 thread가 종료될 때까지 호출되지 않는 것이죠. )
마찬가지로 위 코드를 실행시키시면 프로그램은 영원히 끝나지 않습니다.
pthread_join(p_thread[0], (void **)&status); 라인에서 영원히 기다리고 있겠죠.
pthread_join을 호출하시기 전에 t_function 함수가 무한 loop에서 빠져나오게 하신 다음에 pthread_join을 호출해야합니다.
아 그렇군요 ㅎㅎ
답변 감사합니다
여기서 많은 도움을 얻고 갑니다^^
댓글 달기