이 글은 윤성우의 TCP/IP 소켓 프로그래밍 책을 참고하였습니다.

순서

I. 멀티 스레드의 문제점

II. 해결책


I. 멀티 스레드의 문제점

한 프로세스 안에서 힙과, 데이터 영역을 공유하는 스레드가 2개 이상 있다고 생각해보자.

그리고 이 스레드는 각각 독립적인 실행을 하게 된다.

여기서 생각을 해보면,
공유하는 전역 변수에 독립적인 스레드 A와 B가 같이 접근을 하면 어떻게 될까?

동일한 변수에 접근을 하는 것은 OK!!
But
동일한 변수에 동시에 접근하게 되면 다음과 같은 현상이 일어난다.

예를 들어 A는 +1을 하고 B는 -1을 해야 한다면

A는 0에서 +1을 해서 1을 A에 다시 저장할 것이다.
B는 0에서 -1을 해서 -1을 A에 다시 저장할 것이다.

동시에 접근을 하게 되면, 연산이 늦게 끝난 스레드의 결과값으로 덮어 씌워져 버린다.

즉, 정상적으로는 +1과 -1을 해서 0이 되어야 하는데,
+1이 되거나 -1이 돼버리는 결과가 나온다.

이런 영역을 "임계 영역"이라고 하는데

이를 반드시 해결해주어야 한다.


II. 해결책

여기서는 설명을 안 하고 무엇이 있는지만 짚고 넘어갈 것이다.

이런 스레드의 문제를 해결하는 것을 "스레드 동기화"라고 한다.

동기화 방법에는 두 가지가 있다.

1. 뮤텍스(Mutex)

뮤텍스(Mutual Exclusion)는 말 그대로 동시 접근을 막는 것이다.
즉, 접근한 스레드가 있다면 Block신호를 줘서 막는 것이고,
다른 스레드는 대기를 해야 한다.

2. 세마포어(Semaphore)

뮤텍스가 단순히 접근만 동기화한다면
세마포어는 접근 순서까지 동기화를 시키는 방법이다.

올바른 흐름대로 스레드가 진행되어야 하는데, 순서가 꼬여버리면
큰 문제가 발생할 수 있기 때문이다.

이 두 가지에 대한 자세한 설명은 다음 글에 설명할 것이다.

+ Recent posts