본문 바로가기

Study/Programming

쓰레드 동기화 세마포어(Semaphore)

졸려


안녕하세요 꼬로미입니다


쓰레드 동기화 세마포어에 대한 프로그래밍 입니다


리눅스 기반으로 작성했습니다 ^^*




세마포어(Semaphore)

  • 0과 1만을 사용하는 세마포어 ( 0이면 대기, 1ㅇ디면 접근가능)

  • 뮤텍스의 lock과 unlcok에 해당하는 post, wait 함수를 사용한 임계영역

  • 하나의 Dead Lock을 회피하는 기법

  • 동기화 대상이 여럿일 경우에 사용(화장실이 여러칸있다고 생각)



세마포어 예제(리눅스)



세마포어 2개 생성

sem_init(&sem_one, 0, 0);

sem_init(&sem_one, 0, 1);


세마포어 변수 sem_two를 이용한 wait와 post 함수 호출

sem_wait(&sem_two);

sem_post(&sem_two);

* 뮤텍스(Mutex) 방식의 lock, unlock에 해당하는 함수

* read 함수를 호출하는 쓰레드가 새로운 값을 가져다 놓기 전 accu 함수가 값을 가져가 버리는 상황을 막기 위해 사용


sem_init : 생성

sem_wait : 1 감소, 초기값이 1일때 세마포어 값을 0으로

sem_post : 1 증가, wait 다음 호출되어 세마포어 값을 1으로

이런 특징으로 임계영역을 동기화시킴





실행결과

1,2,3,4,5의 값을 입력하여 15의 결과값을 얻었고

5,5,6,7,7의 값을 입력하여 30의 결과값을 얻어본 결과입니다

^^*