#include <pthread.h>
#include <stdio.h>
pthread_barrier_t barrier;
void* thread_function(void* arg){
printf("Thread %ld reached the barrier.\n", (long)arg);
pthread_barrier_wait(&barrier);
printf("Thread %ld passed the barrier.\n", (long)arg);
return NULL;
}
int main(){
pthread_t thread1, thread2, thread3;
pthread_barrier_init(&barrier, NULL, 3);
pthread_create(&thread1, NULL, thread_function, (void*)1);
pthread_create(&thread2, NULL, thread_function, (void*)2);
pthread_create(&thread3, NULL, thread_function, (void*)3);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
pthread_join(thread3, NULL);
pthread_barrier_destroy(&barrier);
return 0;
}
주의할 점: 반드시 C++이 아닌 C로 컴파일해야 한다. C++로 컴파일할 경우 void*를 long으로 변환할 수 없다.
실행 결과:
Thread 1 reached the barrier.
Thread 2 reached the barrier.
Thread 3 reached the barrier.
Thread 3 passed the barrier.
Thread 1 passed the barrier.
Thread 2 passed the barrier.
pthread_barrier_init의 세 번째 인수 count는 barrier를 다같이 통과할 수 있는 스레드의 수를 의미한다. 4로 바꾸면 실행 결과는 다음과 같다.
Thread 1 reached the barrier.
Thread 3 reached the barrier.
Thread 2 reached the barrier.
까지만 출력되고 프로그램이 더이상 진행되지 않은 채로 멈춘다. 스레드가 3개 뿐이므로 장벽을 통과할 수 없다.
count를 2로 바꾸고 실행하면
Thread 1 reached the barrier.
Thread 2 reached the barrier.
Thread 3 reached the barrier.
Thread 2 passed the barrier.
Thread 1 passed the barrier.
까지 출력되고 프로그램이 멈춘다. 스레드 1과 2는 장벽을 통과했지만 스레드 3은 하나 뿐이므로 장벽을 통과할 수 없다.
반응형