RobotBaram.net
  Home
  About Me
  Life is...
  Gallery
  Project
  Program
  Guest Book  
Login
Life is
 


multithread programming - Synchronization(2)

 

Critical Section

 

여러 Thread가 동시에 같은 메모리나 File Access하려고 할 경우 심각한 문제가 발생할 것이다.

이럴 경우 Critical Section으로 지정하면 하나의 Thread Access할 동안 다른 Thread Access하지

못하게 할 수 있다.

 

stdafx.h 의 맨 아래 줄에

 

#include <afxmt.h>

 

를 추가하고 전역 변수로

 

       CCriticalSection g_cs;

 

를 선언한다. 그래야 모든 Thread들이 Access할 수 있다.

 

이제 동시에 수행되어서는 안 되는 부분에

 

       g_cs.Lock();

 

       // 여기에동시에접근하면안되는코드를삽입한다

 

       g_cs.Unlock();

 

Lock()~Unlock() 으로 감싼 부분은 절대로 동시에 실행이 되지 않는다.

적절한 곳에 Lock()~Unlock()을 사용하기 바란다.

만약 공유되는 데이터가 여러 개가 있다면 CCriticalSection 도 여러 개가 있어야 한다는 것을 잊지 말자.

 

Event

 

여러 개의 Thread가 동작할 때 어떤 특정 이벤트가 발생할 때까지 특정 Thread를 기다리게 하려면

Event를 사용한다.

 

stdafx.h 

 

#include <afxmt.h>

 

를 추가하고 전역변수로

 

       CEvent g_Event;

 

로 선언하고 다음 Thread를 만들었다고 가정하자.

 

UINT ThreadFunc(LPVOID pParam)

{

       ...

       g_Event.Lock();

       // 이벤트가발생해야이곳이실행이된다.

       ...

}

 

Event가 발생할 때까지 Thread g_Event.Lock() Lock된다.

Unlock을 하려면 SetEvent() 함수나 PulseEvent() 함수를 호출해야 한다.

SetEvent() 함수는 g_Event를 완전히 Unlock 하고 PulseEvent() 함수는 한 번만 Unlock하기 때문에

만약 Loop를 돈다면 다음 번에는 다시 Lock() 된다.

 

Mutex

 

Mutually Exclusive(상호 배타적)

 

기본적으로 Critical Section과 비슷하게 동작하지만 Critical Section이 하나의 프로그램에서 여러 개의

Thread를 관리한다면 Mutex는 여러 프로그램에서 동시에 같은 리소스에 Access하는 것을 막아 준다.

 

Semaphore

 

수기신호

 

특정 영역의 코드를 실행하는 Thread의 최대 개수를 설정할 수 있다.

세마포어는 내부에 리소스 카운터를 두고 Thread가 진입할 때마다 카운터 증가, 빠져 나갈 때마다 카운터를 감소

시켜서 현재 리소스를 사용하고 있는 Thread의 개수를 기억하고 있고 만약 최대 카운터를 넘으려고 하면

Lock에서 기다리게 한다.

첫 번째 인자는 리소스 카운트의 초기값, 두 번째 인자는 최대 Thread의 개수이다.

 

       CSemaphore g_semaphore(2, 2);

 

       g_semaphore.Lock();

 

       // Semaphore가관리하는부분

 

       g_semaphore.Unlock();

 

Multi Lock

 

Synchronization object들은 개별적으로 Lock(), Unlock() 될 수도 있지만

Multi Lock을 사용하면 한 번에 여러 Object들을 Lock(), Unlock() 시킬 수 있다.

 

// 전역변수

CEvent g_Event[4];

 

 

// 네개의Event가모두발생해야Lock이해제

CMultiLock multiLock(g_Event, 4);

multiLock.Lock();

 

 

// 네개중하나의이벤트만발생해도Lock이해제

CMultiLock multiLock(g_Event, 4);

multiLock.Lock(INFINITE, 4);


 
   
작성일 : 09-12-31 02:15