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은 영원히 대기하게 됩니다.
이런 부분을 주의해야 합니다.
'프로그래밍 > C' 카테고리의 다른 글
[C] dereferencing pointer to incomplete type 에러 (0) | 2022.10.11 |
---|---|
[C] expected specifier-qualifier-list before, unknown type name 에러 (0) | 2022.07.04 |
[C] likely, unlikely 함수 (0) | 2022.04.26 |
[C] IPC 중에 어떤 걸 선택해야 할까 (0) | 2022.03.27 |
[C] 소켓 옵션 제어 ( getsockopt, setsockopt ) (2) (0) | 2022.02.27 |