본문 바로가기
WORK/Sotfware

MFC Thread 완전정복 3 - 동기화

by KANG Stroy 2008. 6. 2.
728x90
728x90

- symmetric multiprocessing  ( 대칭 다중 처리,SMP )

서로 다른 스레드들을 서로 다른 프로세서에 할당해서 동시에 둘이상의 스레드들을 실행한다. 스케쥴러는 다수의 실행 스레드들을 한번에 실행하고 있는 것처럼 만들기 위해 가능한 효율적으로 이들 사이에 cpu시간을 나누는것이 목표이다.


- Thread Syncronization ( 스레드 동기화 )

윈도우즈는 4종류의 동기화 개체를 지원한다.

-- Critical Sections

-- Mutexes

-- Events

-- Semaphores


1. Critical Sections ( 임계영역 )

- 가장 간단한 형식의 동기화 개체

- 배타적 access 보장 ( 접근 직렬화 ? )

- 같은 프로세스에서 실행되는 스레드 동기화 ( 하나의 응용프로그렘내에서만 )


CCriticalSection g_cs; //전역 데이터


//Thread A

g_cs.Lock(); //....(가)

.... (1)

g_cs.Unlock();  // ...(나)


//Thread B

g_cs.Lock();

...

g_cs.Unlock();


스레드 A는 이미 (1) 항목을 수행 중인데, 스레드 B가 A에 접근하여 동시에 (1)에 수행할 경우, 문제가 발생할 수 있다.

메모리를 2개가 동시에 사용..

그러한 것을 방지 하게 위해 ( 직렬화 ) 위의 예제처럼 Lock을 걸어두면(가),

스레드 B는 A가 Unlock() 할 때(나) 까지 (가)에서 멈춰 있다.

그래서 (1)은 하나의 스레드만 허용된다.



단순히 변수하나를 서로 다른 스레드가 사용하고 싶다면,

g_cs.Lock();

nVar++;

g_cs.Unlock();


위와 같이 쓸수 있지만, 아래와 같은 함수를 이용할 수 있다.

::InterlockedIncrement

::InterlockedDecrement

::InterlockedExchage

::InterlockedCompareExchage

::InterlockedExchangedAdd


따라서 위의 예제는 아래와 같이 사용할 수 있다.


::InterlockedIncrement( &nVar );


( 단 nVar 은 32비트 변수 )



2. MUTEX

- 둘이상의 서로 다른 프로세스( 응용프로그램 )에서 실행되는 스레드 동기화 작업


CMutex g_mutex( FALSE, _T("MyMutex"));

...

g_mutex.Lock();

...

g_mutex.Unlock();



CMutex 생성자의 첫번째 매개변수

- 생성시 참근다. TRUE, 잠그지 않는다:FALSE

두번째 매개변수

- 두 프로세스에서 사용하는 동일한 이름. 꼭 같은 이름이어야 동기화 가능.



if( g_mutex.Lock(10000) ) 

{  //잠금 해제. 외부 다른 스레드가 g_mutex.Unlock() 호출 했다.

  ....

  g_mutex.Unlock();

}

else

{ // 10초간 기다렸다 반환됨.

  ....

}


* CriticalSection과 Mutex의 차이

다른 스레드가 Unlock() 할때까지 현재 스레드는 기다려야 하는데, 만약 다른 스레드에서 정말 Unlock()함수를 호출할 기미가 안보일 경우 정말 무한정기다릴까??

CriticalSection : 스레드가 무한정 기다린다.

Mutex : 시스템이 뮤텍스를 해제하여 다른 스레드들이 이용하게 해준다.

728x90

'WORK > Sotfware' 카테고리의 다른 글

Edit Clear  (0) 2008.06.02
RS232 통신  (0) 2008.06.02
MFC Thread 완전정복 ( 마지막 )  (0) 2008.06.02
MFC Thread 완전정복 2 - Thread 종료하기  (0) 2008.06.02
MFC Thread 완전정복 1(펌)  (0) 2008.06.02

댓글