본문 바로가기
VisualStudio.C++.C#/코딩팁,함수활용,단편

Critical Section (크리티컬 섹션)

by i.got.it 2020. 5. 13.

 

 

개요

Critical Section (크리티컬 섹션)  을 설정한 구간은 한 번에 하나의 "스레드"에서만 사용가능하다.
- 프로세스 내에 여러 스레드가 있는 환경에서, 우리가 설정해둔 "크리티컬 영역" 에 어떤 스레드가 먼저 진입하여 크리티컬 영역을 벗어나지 않은 상태에서는 동일 프로세스의 다른 스레드에서 해당 크리티컬 영역에 진입하는 것을 금지한다. 
- 후발 스레드의 "크리티컬 섹션" 진입금지 방식에 "리턴" 혹은 "대기"를 설정할 수 있다. "대기"란 선 진입한 스레드가 해당영역을 벗어날때까지 후발 스레드는 "대기" 상태로 있다가  선진입한 스레드가 해당영역 벗어나면 대기중인 후발 스레드가 크리티컬 영역을 실행하는것. "리턴"이란 후발 스레드는 "대기"상태에 있지 않고 "리턴"되어 크리티컬 영역 실행 하지 않는 방식이다.


구현방법. - Win32API 함수 또는 MFC 이용가능.

 

Critical Section - Win32API 함수 이용.

  Win32API 함수.

  

 

 함수명 개요 설명
 InitializeCriticalSection 크리티컬 섹션 오브젝트 초기화.  
 DeleteCriticalSection 크리티컬 섹션 오브젝트 제거.  
 EnterCriticalSection 크리티컬 섹션 시작부 지정.  크리티컬 영역을 선점한 스레드가 있는 경우 후발 스레드가 진입하려는 경우 진입대기상태에 있고, 선점 스레드가 크리티컬 영역벗어난 경우 후발 스레드가 해당영역 실행함.
 LeaveCriticalSection 크리티컬 섹션 끝 지정.  
 TryEnterCriticalSection 크리티컬 섹션 시작부 지정.  크리티컬 영역을 선점한 스레드가 있는 경우 후발 스레드가 진입하려는 경우 진입대기 하지 않고 리턴됨. 즉,  후발스레드는 크리티컬 영역 실행하지 않고 건너뛰게 됨.



 코드예.

 

CRITICAL_SECTON g_cs;  // 크리티컬 섹션 오브젝트 선언.


::InitializeCriticalSection(&g_cs); //  CRITICAL_SECTON g_cs 초기화.


::DeleteCriticalSection(&g_cs); //  프로그램 종료시 등의 시점에 CRITICAL_SECTON g_cs 제거.


// 크리티컬 영역 지정예.
::EnterCriticalSection(&g_cs);
이 부분이 "크리티컬 영역" 으로 됨.
::LeaveCriticalSection(&g_cs);

 

 

 

Critical Section - MFC 클래스 CCriticalSection 이용.

헤더 : afxmt.h


 코드예.

CCriticalSection g_CS;  // 전역으로 변수선언. 


// 크리티컬 영역 지정예.
g_CS.Lock();
이 부분이 "크리티컬 영역" 으로 됨.
g_CS.Unlock();

 

 

 

 

 

코드예 

 

//Definition of critical section class
class CMyCritSectClass
{
   static CString _strShared; //shared resource
   static CCriticalSection _critSect;

public:
   CMyCritSectClass(void) {}
   ~CMyCritSectClass(void) {}
   void SomeMethod(void); //locks, modifies, and unlocks shared resource
};

//Declaration of static members and SomeMethod
CString CMyCritSectClass::_strShared;
CCriticalSection CMyCritSectClass::_critSect;

void CMyCritSectClass::SomeMethod()
{
   _critSect.Lock();
   if (_strShared == "")
      _strShared = "<text>";
   _critSect.Unlock();
}

 

 

 

#include <afxmt.h>  // MFC에서 CCriticalSection 포함

class MyClass {
private:
    CCriticalSection m_cs;  // 인스턴스마다 고유한 크리티컬 섹션
    MyStruct data;          // 각 인스턴스가 관리하는 데이터

public:
    void UpdateData(const MyStruct& newData) {
        CSingleLock lock(&m_cs, TRUE);  // 크리티컬 섹션 잠금
        data = newData;
    }

    MyStruct ReadData() {
        CSingleLock lock(&m_cs, TRUE);  // 크리티컬 섹션 잠금
        return data;
    }
};

 

 

 

여러 함수, 여러 자원 에서의 크리티컬 섹션 

크리티컬 섹션은 보호할 자원(=변수, 개체 ) 별로 생성하면 된다. 

여러 함수에서 동일 자원을 사용하고 있다면 크리티컬 섹션은 해당 자원 보호용 1개만 만들어서 활용하여 각 함수의 해당 자원 부분을 보호하고, 

CRITICAL_SECTION cs;  // 모든 함수가 공유하는 Critical Section

void Init()
{
    EnterCriticalSection(&cs);
    // 공유 자원에 접근
    LeaveCriticalSection(&cs);
}

void OtherFunction()
{
    EnterCriticalSection(&cs);
    // 공유 자원에 접근
    LeaveCriticalSection(&cs);
}

 

 

각 함수가 다른 자원을 사용 하는 경우에는 해당 자원 별로 크리티컬 섹션 변수 만들어서 개별적으로 보호 처리한다. 

CRITICAL_SECTION cs1;  // 자원 A에 대한 Critical Section
CRITICAL_SECTION cs2;  // 자원 B에 대한 Critical Section

void FunctionA()
{
    EnterCriticalSection(&cs1);
    // 자원 A에 접근
    LeaveCriticalSection(&cs1);
}

void FunctionB()
{
    EnterCriticalSection(&cs2);
    // 자원 B에 접근
    LeaveCriticalSection(&cs2);
}

 

 

 

 

 

 

 

 

 

상위 정리

 

Visual Studio/VC++/C/C# 활용정리 -> http://igotit.tistory.com/11

 

 

Visual Studio , Visual C++ 활용 정리.

Visual Studio C++ 활용 Visual Studio C++ Visual Studio Visual C++ / C# 1.설치, 설정 주제 비고. Visual Studio 2010 설치. Visual Studio 2013 (Community)무료 설치. Visaul Studio 2015 (Community)무료..

igotit.tistory.com

 

 

 

연관 

 C++17 부터 동기화 오브젝트 제공됨. 

 

std::shared_mutex . 멀티 스레드 읽기 쓰기 락

std::shared_mutex . 읽기 쓰기 락 - C++ 17 부터 제공됨   #include class MyClass {private: std::shared_mutex rw_mutex; // 읽기-쓰기 락 객체 MyStruct data; // 보호할 구조체 변수public: void UpdateData(const MyStruct& newData) { st

igotit.tistory.com

 

 

 

 


첫 등록 : 2016.01.12

최종 수정 : 2024.09.05

단축 주소 : https://igotit.tistory.com/545


 

댓글



 

비트코인




암호화폐       외환/나스닥/골드         암호화폐/외환/나스닥/골드
     
현물 |선물 인버스 |선물 USDT       전략매니저(카피트레이딩)         프랍 트레이더 온라인 지원가능. MT4,MT5