Language/C

C - 글로벌 변수를 이용한 mutual exclusion

ShinyOcean 2021. 6. 19. 18:27

 

 

안녕하세요 :)

 

이번포스팅에서는 글로벌 변수를 이용한 상호배제에 대하여 다루어볼것입니다.

설명전에 일단! 제가 짠 야매코드에요... 배운내용을 기억나는대로 한번 구현해본거라서... 오류가 있을수 있습니다... 사실 맞게 구현한지도 모르겠네요 ㅎ... 세마포어 관련 라이브러리를 사용하지 않고 상호배제를 이룩할수 있는 방법중에 제 코드보다 더 좋은 방법이 있다면 알려주십시오!

 

상호배제는 운영체제 카테고리에서도 다룬것 처럼 크리티컬한 코드의 영역에 다중접근을 방지하는것인데요. 만약 프린터 디바이스를 생각해보겠습니다. 출력하고싶은 두가지 문구 (안녕하세요, hi)가 비슷한시간에 접근하였을때 이영역을 보장하지 않고 출력한다면 결과가 이상하겠죠! 

 

안h녕하i세요 

 

이런식으로 섞여서 나오나요? 아닙니다. 둘중 조금이라도 먼저들어온 녀석을 먼저 출력하고 다른녀석은 기다리구 있다가 전에 들어간 것이 끝나면 나오죠

 

안녕하세요

hi

이런식일것입니다.

 

이번포스팅에서는 스레드를 활용해서 한번 이문제를 접근해보겠습니다.

 

만약

스레드1 = func1 세번 출력

스레드2 = func2 세번 출력

스레드3 = func3 세번 출력

 

이라 가정시 상호배제가 보장되지 않는경우 출력결과는

 

func1

func2

func3

func3

func2

...

...

 

 

이런식으로 중구 난방 일것입니다. 하지만 보장된다면 스레드 하나가 출력을 세번 수행 하는 동안 다른 스레드 들은 대기 하고 있을테고 아래와 같을것 입니다.

 

func1

func1

func1

func2

func2

func2

func3

func3

func3

 

이를 위해 글로벌 변수를 사용하여 다른 스레드가 출력문을 실행하고 있을때는 1 아닐때는 0으로 초기화하고

0일때만 스레드가 출력문을 수행할수 있도록 해보았습니다..

 

 

 

 

야매 코드)

 

 

 

결과)

 

 

 

위의 결과처럼 func3이 세번 출력되는 동안 func2와 func1은 대기하고 있으며 다음은 1, 2 순으로 세번씩 출력된것을 확인할수 있습니다.