정보보안 공부/운영체제, 시스템

[운영체제] 세마포어 구현

pxatd 2023. 2. 6. 16:27
728x90

child1과 child2가 거의 동시에 실행되기에 하나의 실행이 채 끝나기 전에 entered되고 exits 되는 일이 발생함

 

이를 방지하기 위해 child1, child2 중 어떤 것이 먼저 실행되면 다른 하나는 접근하지 못하도록 하는 세마포어를 구현해보자. 

 

실행 환경 : WSL ubuntu 

#include <stdio.h>
#include <unistd.h>
#include <assert.h>
#include <semaphore.h>
#include <pthread.h>
#include <stdlib.h>

sem_t m1, m2;

void *child1(void *arg) {
    printf("child thread 1 entered!\n");
    sem_post(&m1);// call semaphoreshere here
    sem_wait(&m2);
    printf("child thread 1 exits!\n");
    return NULL;
}

void *child2(void *arg) {
    printf("child thread 2: entered!\n");
    sem_post(&m2);// call semaphores here
    sem_wait(&m1);
    printf("child thread 2: exits\n");
    return NULL;
}

int main(int argc, char *argv[]) {
    pthread_t p1, p2;
    printf("parent thread: begin\n");
    sem_init(&m1, 0, 0);// init semaphores here
    sem_init(&m2, 0, 0);
    pthread_create(&p1, NULL, child1, NULL);
    pthread_create(&p2, NULL, child2, NULL);
    pthread_join(p1, NULL);
    pthread_join(p2, NULL);
    printf("parent thread: end\n");
    return 0;
}

 

세마포어를 구현하기 전 실행 결과 : 

 

세마포어를 구현한 후 실행 결과 : 

 

728x90