세마포어란 멀티프로세싱 환경에서 복수의 프로세스에 의해 동시에 사용되서는 안되는 공유자원(메모리 등)의 접근을 제한하는 대표적인 방법. 교차로에서 '신호등'과 같은 역할을 한다.
P(S)
V(S)
semaphore.h 헤더파일에 포함된 아래 3개의 함수를 '사용'하여 3대의 기차가 교차로를 순차적으로 통과하도록 프로그래밍.
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
//세마포어 정의
sem_t semaphore;
void *thread_train(void *i){
int train_num = *((int*)i);
// wait P(S) 함수
sem_wait(&semaphore);
printf("%d번 기차가 교차로를 통과했습니다. \\n", train_num);
// V(S) 함수
sem_post(&semaphore);
free(i);
}
int main() {
// 세마포어 생성
sem_init(&semaphore, 0, 1);
pthread_t t[3];
int *intPtr;
// 3개의 쓰레드 생성(3대의 기차로 가정)
for (int i = 0; i < 3; i++) {
int train_num = i+1;
intPtr = (int*)malloc(sizeof(int));
*intPtr = i + 1;
pthread_create(&t[i], NULL, thread_train, (void*)intPtr);
}
pthread_join(t[0], NULL);
pthread_join(t[1], NULL);
pthread_join(t[2], NULL);
sem_destroy(&semaphore);
return 0;
}