pthread

pthread_barrier_t example

Falto 2024. 10. 27. 15:38
#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은 하나 뿐이므로 장벽을 통과할 수 없다.

 

반응형