C 언어의 pthread_equal() 함수는 POSIX 스레드(pthread) 환경에서 두 스레드가 서로 동일한지 확인할 때 사용하는 함수입니다. 이 함수는 0 또는 0이 아닌 값을 반환하는데, 두 스레드가 같으면 0이 아닌 값(참)을 반환하고, 다르면 0을 반환합니다.
함수 문법
int pthread_equal(pthread_t th1, pthread_t th2);
여기서 th1과 th2는 비교하고자 하는 두 스레드의 식별자입니다. 참고로 pthread_t 타입은 내부 구조가 시스템마다 다를 수 있으므로, == 연산자로 직접 비교하지 말고 반드시 pthread_equal() 함수를 사용해야 합니다. 또한 현재 실행 중인 스레드의 ID를 얻으려면 pthread_self() 함수를 활용합니다.
예제 1: 자기 자신 스레드와 비교하기
먼저 현재 실행 중인 스레드를 저장된 스레드와 비교하여 결과를 확인해 보겠습니다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <pthread.h>
pthread_t sample_thread;
void* my_thread_function(void* p) {
if (pthread_equal(sample_thread, pthread_self())) { // pthread_self()는 현재 스레드 ID를 반환
printf("Threads are equal\n");
} else {
printf("Threads are not equal\n");
}
}
main() {
pthread_t th1;
sample_thread = th1; // th1 스레드를 다른 스레드 객체에 할당
pthread_create(&th1, NULL, my_thread_function, NULL); // 스레드 생성
pthread_join(th1, NULL); // 메인 스레드에서 해당 스레드 종료 대기
}실행 결과
Threads are equal
생성된 스레드 내부에서 sample_thread와 pthread_self()가 가리키는 스레드가 동일하므로 "Threads are equal"이 출력됩니다.
예제 2: 서로 다른 두 스레드 비교하기
이번에는 서로 다른 두 스레드를 비교했을 때 어떤 결과가 나오는지 확인해 보겠습니다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <pthread.h>
pthread_t sample_thread;
void* my_thread_function1(void* ptr) {
sample_thread = pthread_self(); // 첫 번째 스레드의 ID를 저장
}
void* my_thread_function2(void* p) {
if (pthread_equal(sample_thread, pthread_self())) { // 현재 스레드 ID와 비교
printf("Threads are equal\n");
} else {
printf("Threads are not equal\n");
}
}
main() {
pthread_t th1, th2;
pthread_create(&th1, NULL, my_thread_function1, NULL); // 첫 번째 스레드 생성
pthread_create(&th2, NULL, my_thread_function2, NULL); // 두 번째 스레드 생성
pthread_join(th1, NULL); // 첫 번째 스레드 종료 대기
pthread_join(th2, NULL); // 두 번째 스레드 종료 대기
}실행 결과
Threads are not equal
첫 번째 스레드에서 저장한 ID와 두 번째 스레드의 ID는 서로 다르므로 "Threads are not equal"이 출력됩니다.
정리
pthread_equal()은 멀티스레드 프로그래밍에서 특정 작업이 현재 스레드에서 실행 중인지 판단하거나, 스레드 간 충돌을 방지하는 로직을 구현할 때 유용하게 활용됩니다. 스레드 ID 비교 시에는 항상 이 함수를 사용하는 것이 안전하며, 이식성 측면에서도 권장되는 방식입니다.