본문으로 바로가기

[C] pthread_join 쓰레드 조인

category 프로그래밍/C 2022. 5. 25. 21:14
728x90
반응형

C에서 쓰레드를 사용하다보면 자주 사용하는 쓰레드 함수들이 있습니다.

 

오늘은 pthread_join에 대해 알아보겠습니다.

 

------------------------------------------------------------------------------------------------

#include <pthread.h>

int pthread_join(pthread_t thread, void **retval);

------------------------------------------------------------------------------------------------

 

이 함수는 쓰레드를 실행한 후, 쓰레드가 종료될 때까지 기다리게됩니다.

 

성공 시 0 을 반환하고, 문제가 있을 경우, 에러 코드를 반환합니다.

 

------------------------------------------------------------------------------------------------

EDEADLK : 교착 상태가 감지되었습니다(예: 두 쓰레드가 서로 결합을 시도함). 또는 쓰레드는 호출 쓰레드를 지정합니다.

EINVAL : 쓰레드는 결합 가능한 스레드가 아닙니다.

EINVAL : 다른 쓰레드가 이미 이 쓰레드와 합류하기를 기다리고 있습니다.

ESRCH : 쓰레드ID가 있는 스레드를 찾을 수 없습니다.

------------------------------------------------------------------------------------------------

 

pthread_join이 어떨때 사용되는지에 대해 예제 코드를 한번 살펴보겠습니다.

 

위의 코드는 쓰레드에서 전역변수 num에 100을 설정하여 num 값을 출력을 하는 프로그램입니다.

 

위의 코드를 컴파일하여 실행하면 출력결과는 어떻게 될까요?

 

결과는 ret : 10입니다.

 

이유는 쓰레드를 생성하지만, 쓰레드의 수행을 끝까지 기다리지 않고, sleep(5)가 수행되기 전에 프로그램이 종료 되기 때문입니다.

 

처음에 초기화한 num 10이 출력이됩니다.

 

num에 100을 출력하고 싶다면 위의 소스코드에서 주석처리되어 있는 pthread_join을 해제해야합니다.

 

주석을 해제하게 되면 쓰레드가 실행이 되고, pthread_join에서 쓰레드가 종료될 때까지 기다리게됩니다.

 

쓰레드의 sleep(5)를 기다린 후, num에 100이 설정 되고, 쓰레드는 종료됩니다.

 

그렇게 되면 pthread_join 함수를 호출하게 됩니다.

 

결과는 ret : 100이 됩니다.

 

pthread_join은 많이 사용합니다.

 

그러나 소스코드를 잘못짜게 되어 쓰레드가 종료가 되지 않는다면, pthread_join은 영원히 대기하게 됩니다.

 

이런 부분을 주의해야 합니다.

728x90
반응형