[OS] 리눅스 C언어로 다중 pthread semaphore 사용 예제

딱지의겨울

·

2021. 4. 6. 13:43

 

리눅스 운영체제 사용이 서툰데 아무래도 phtread.h 와 semaphore.h 사용이 직관적이어서 윈도우로 실습 해보다가 리눅스로 갈아타서 작업했다.

 

우선 리눅스에서 c 컴파일 하는 방법은: 폴더를 생성한 후에 해당 폴더에서 터미널을 켜서 작업한다.

(gcc나 vim이 깔려 있는 걸 가정했다.)

커맨드를 입력하면 입력창이 나온다. I를 눌러서 insert 모드로 전환한 후에 코드를 작성하면 된다.

작성 다 한 후에는 :wq 를 치면 저장된다. 그리고 그냥 나는 텍스트편집기로 수정해서 컴파일 하긴 했다.

 

프로그램의 목표는 간단하게 semaphore 함수 (wait, signal)을 사용해서 두 개의 함수가 돌아가도록 하는 것이다. count라는 정수형 전역변수에 각각의 함수가 접근하여 한 함수는 10000번 루프를 돌면서 1씩 증가시키고, 다른 함수는 10000번 루프를 돌면서 1을 감소시킨다. race condition이 나오지 않았다면 마지막에 결과를 확인해봤을 때 count 값이 0이 나와야 한다. pthread 20개를 생성해서 10개씩 각각 다른 함수로 돌리도록 했다.

아무리 컴파일해도 자꾸 0이 안나와서 정말 온갖 걸 다 시도해봤다. 세마포어 변수를 2개 만들어서 주고받도록도 해보고 많이 시도했는데 결론은 컴파일 커맨드 라인의 문제가 아니었나 싶다.

 

내가 사용한 컴파일 커멘드는 다음과 같다.

 

며칠 잡고 있었는데 어떻게 해도 0이 나와서 100만번까지 돌려봤다. 오히려 flag 변수를 세마포어처럼 쓸때는 별 오류 없이 잘 나왔는데 세마포어 라이브러리를 사용했을 때 생각처럼 잘 되지 않아서 답답했던 것 같다.