C 언어에서 pthread_self() 함수란?
이 글에서는 C 언어에서 pthread_self() 함수가 어떤 역할을 하는지 자세히 살펴보겠습니다. pthread_self()는 호출한 시점의 현재 스레드 ID를 가져오는 함수입니다. 이 함수를 사용하면 현재 존재하는 스레드를 고유하게 식별할 수 있습니다.
단, 한 가지 주의할 점이 있습니다. 여러 스레드가 동작하는 환경에서 어떤 스레드가 종료되면, 해당 스레드가 사용하던 ID는 이후 새로 생성되는 스레드에게 재사용될 수 있습니다. 즉, 스레드 ID의 고유성은 '현재 실행 중인 스레드들' 사이에서만 보장된다는 점을 기억해야 합니다.
반환값과 비교 방법
pthread_self()는 POSIX 스레드(pthread) 라이브러리에 정의된 함수로, pthread_t 타입의 값을 반환합니다. 또한 두 스레드 ID가 같은지 비교할 때는 등호(==) 연산자 대신 pthread_equal() 함수를 사용하는 것이 표준적으로 권장됩니다.
예제 코드
다음 예제는 메인 함수와 별도로 생성된 스레드 함수 내부에서 각각 스레드 ID를 출력하는 프로그램입니다.
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void* func(void* p) {
// pthread_self()로 현재 스레드의 ID를 가져옴
printf("From the function, the thread id = %d\n", pthread_self());
pthread_exit(NULL);
return NULL;
}
main() {
pthread_t thread; // 스레드 선언
pthread_create(&thread, NULL, func, NULL); // 새 스레드 생성
printf("From the main function, the thread id = %d\n", thread);
pthread_join(thread, NULL); // 메인 스레드와 조인(대기)
}
실행 결과
From the main function, the thread id = 1 From the function, the thread id = 1
코드 설명
- pthread_create(): 지정한 함수를 실행하는 새로운 스레드를 생성합니다.
- pthread_self(): 스레드 함수 내부에서 자기 자신의 스레드 ID를 조회합니다.
- pthread_exit(): 현재 스레드를 안전하게 종료합니다.
- pthread_join(): 메인 스레드가 생성한 스레드의 작업이 끝날 때까지 기다립니다.
컴파일 방법
POSIX 스레드 라이브러리를 사용하므로, GCC로 컴파일할 때는 반드시 -lpthread 옵션을 붙여야 합니다.
gcc program.c -o program -lpthread
실행 결과에서 확인할 수 있듯이, 메인 함수의 스레드 변수(thread)와 스레드 함수 내부에서 pthread_self()로 얻은 값이 동일합니다. 참고로 실제 환경에서는 스레드 ID가 매우 큰 값으로 출력될 수 있으며, 이식성을 위해 ID를 단순 숫자처럼 다루기보다는 pthread_t 타입 그대로 저장하고 pthread_equal()로 비교하는 것이 바람직합니다.