Critical section
임계 구역(critical section) 또는 공유변수 영역은 병렬컴퓨팅에서 둘 이상의 스레드가 동시에 접근해서는 안되는 공유 자원(자료 구조 또는 장치)을 접근하는 코드의 일부를 말한다. 임계 구역은 지정된 시간이 지난 후 종료된다. 때문에 어떤 스레드(태스크 또는 프로세스)가 임계 구역에 들어가고자 한다면 지정된 시간만큼 대기해야 한다. 스레드가 공유자원의 배타적인 사용을 보장받기 위해서 임계 구역에 들어가거나 나올때는 세마포어 같은 동기화 매커니즘이 사용된다.
Windows와 Linux의 Critical Section 함수 비교
Critical Section은 Windows에서 여러 쓰레드가 접근하지 못하는 임계 영역을 지정하기 위해서 사용된다. Critical Section은 Windows에서는 User객체로만 사용되며, 리눅스에서는 Mutex로 구현을 해 주면 된다.
Windows | Linux |
InitializeCriticalSection() | pthread_mutex_init() |
DeleteCriticalSection() | pthread_mutex_destroy() |
EnterCriticalSection() | pthread_mutex_lock() |
LeaveCriticalSection() | pthread_mutex_unlock() |
Win32의 동기화 구조체 및 함수의 종류
- CRITICAL_SECTION: 임계영역 동기화 구조체.
- InitializeCriticalSection(): 인계영역 동기화 변수 초기화.
- DeleteCriticalSection(): 인계영역 동기화 변수 해제.
- EnterCriticalSection(): 임계영역 동기화 변수를 점유한다. 만약 이미 점유한 스레드가 존재할 경우 대기상태로 넘어간다.
- TryEnterCriticalSection(): 임계영역 동기화 변수를 점유한다. 만약 이미 점유한 스레드가 존재할 경우 대기상태로 넘어가지 않고 바로 반환된다.
- LeaveCriticalSection(): 인계영역 점유 해제. 이미 점유한 스레드가 존재할 경우 해제한다.
동기화 객체 및 함수의 사용방법
Windows
- InitializeCriticalSection()를 사용하여 초기화한다.
- EnterCriticalSection(), TryEnterCriticalSection(), LeaveCriticalSection() 사용가능.
- DeleteCriticalSection()를 사용하여 해제한다.
Linux
- pthread_mutex_init()를 사용하여 뮤텍스(Mutex) 초기화.
- pthread_mutex_lock(), pthread_mutex_unlock() 사용가능.
- pthread_mutex_destroy()를 사용하여 해제한다.
간단한 임계영역 Win32 C++ 클래스
만약 Linux용으로 만들고 싶을 경우엔, 각각에 해당하는 함수만 교체하고, 헤더파일을 pthread.h로 변경한다.
class Lock
{
private:
CRITICAL_SECTION _critical_section;
public:
Lock() {
InitializeCriticalSection(&_critical_section);
}
virtual ~Lock() {
DeleteCriticalSection(&_critical_section);
}
public:
void lock() {
EnterCriticalSection(&_critical_section);
}
void unlock() {
LeaveCriticalSection(&_critical_section);
}
};
See also
Favorite site
MSDN
- [http://msdn.microsoft.com/en-us/library/windows/desktop/ms682530(v=vs.85.aspx CRITICAL_SECTION Reference]
- [http://msdn.microsoft.com/en-us/library/windows/desktop/ms683472(v=vs.85.aspx InitializeCriticalSection() Reference]
- [http://msdn.microsoft.com/en-us/library/windows/desktop/ms682552(v=vs.85.aspx DeleteCriticalSection() Reference]
- [http://msdn.microsoft.com/en-us/library/windows/desktop/ms682608(v=vs.85.aspx EnterCriticalSection() Reference]
- [http://msdn.microsoft.com/en-us/library/windows/desktop/ms686857(v=vs.85.aspx TryEnterCriticalSection() Reference]
- [http://msdn.microsoft.com/en-us/library/windows/desktop/ms684169(v=vs.85.aspx LeaveCriticalSection() Reference]
- [http://msdn.microsoft.com/en-us/library/windows/desktop/ms683472(v=vs.85.aspx InitializeCriticalSection() Reference]
- [http://msdn.microsoft.com/en-us/library/windows/desktop/ms682608(v=vs.85.aspx EnterCriticalSection() Reference]
- [http://msdn.microsoft.com/en-us/library/windows/desktop/ms686857(v=vs.85.aspx TryEnterCriticalSection() Reference]
- [http://msdn.microsoft.com/en-us/library/windows/desktop/ms684169(v=vs.85.aspx LeaveCriticalSection() Reference]
- [http://msdn.microsoft.com/en-us/library/windows/desktop/ms682552(v=vs.85.aspx DeleteCriticalSection() Reference]