- 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 : 시스템이 뮤텍스를 해제하여 다른 스레드들이 이용하게 해준다.
'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 |
댓글