Page 37 -
P. 37

두 스레드가 동시에 Array<int>의 Add() 함수를 호출하면 여러 스레드가 Array<int> 변수들을 변
                    경합니다. 그러면 두 변수 중 하나만 변경된 상태에서 다른 스레드가 그대로 배열을 액세스하겠지
                    요. 이 과정에서 배열을 가리키는 포인터 변수는 엉뚱한 값, 예를 들어 이미 힙에서 해제된 메모리                            1

                    를 잠시 가리킬 수도 있습니다. 충돌이 발생하는 이유는 바로 이 때문입니다. 이 역시 데이터 레이
                    스 현상 중 하나입니다.                                                                     멀티스레딩
                    따라서 Array<int>를 스레드가 액세스할 때는 Array<int> 안의 두 멤버 변수를 모두 바꾸든지, 아

                    니면 하나도 바꾸지 않든지 해야 합니다. 즉, 두 멤버 변수를 건드리는 동안에는 다른 스레드가 절
                    대 건드리지 못하게 해야 합니다. 이를 원자성(atomicity)이라고 합니다. 그래야 Array<int>의 두 변
                    수는 항상 일관성 있는 상태를 유지할 수 있습니다. 이를 일관성(consistency)이라고 합니다.

                    멀티스레드 프로그래밍을 하다 보면 이렇게 원자성과 일관성을 유지하는 특수한 조치를 해야 할
                    때가 있습니다. 이러한 조치들을 통칭하여 동기화(synchronize)라고 하며, 대표적인 것이 임계 영역
                    과 뮤텍스(또는 상호 배제라고도 함), 잠금(lock, 락) 기법입니다.






                    1.6         임계 영역과 뮤텍스                                     GAM E SE RVER








                    경쟁 상태를 해결하는 여러 방법 중 하나는 다음과 같습니다.

                      “스레드에서 어떤 정보 X를 사용하고 있는 동안 다른 스레드는 X를 건드리지 못하게 한다!”

                    좀 더 정확히 말하자면 다음과 같습니다.

                      “다른 스레드는 X를 건드리려고 하면 기다린다. 현재 스레드가 X를 다 사용할 때까지!”

                    이때 사용하는 것이 뮤텍스(mutex)입니다. 뮤텍스는 상호 배제(mutual exclusion)의 줄임말이며, 뮤텍

                    스를 사용하는 방법은 다음과 같습니다.

                    1.  X, Y를 보호하는 뮤텍스 MX를 만듭니다.
                    2.  스레드는 X, Y를 건드리기 전에 MX에 “사용권을 얻겠다.”라고 요청합니다.

                    3.  스레드는 X, Y를 액세스합니다.

                    4.  액세스가 끝나면 MX에 “사용권을 놓겠다.”라고 요청합니다.

                                                                                                  045
   32   33   34   35   36   37