중요 섹션 개체 사용

다음 예제에서는 스레드가 중요한 섹션을 초기화, 입력 및 해제하는 방법을 보여 줍니다. InitializeCriticalSectionAndSpinCount, EnterCriticalSection, LeaveCriticalSection및 DeleteCriticalSection함수를사용합니다.

Warning

교착 상태 위험: 스레드가 여러 중요 섹션을 획득해야 하는 경우 항상 모든 스레드에서 일관되고 문서화된 순서로 해당 섹션을 획득합니다. 다른 스레드에서 여러 순서로 잠금을 획득하는 것이 교착 상태의 가장 일반적인 원인입니다. 또한 EnterCriticalSection 은 무기한 차단됩니다. 비차단 획득 시도에 TryEnterCriticalSection 을 사용하고, 시간 제한 잠금 획득이 필요한 경우 기한이 있는 제한된 재시도 루프를 구현합니다.

메모

최신 C++ 대안: 새 코드의 경우 std::mutex와 함께 std::lock_guard 또는 std::scoped_lock (C++17) 사용을 고려하세요. 이들은 RAII 기반 잠금 관리를 제공하여 예외가 발생하더라도 잠금이 해제되도록 보장합니다. 읽기 작업이 많은 워크로드의 경우 SRW(Slim Reader/Writer) 잠금 또는 std::shared_mutex.

// Global variable
CRITICAL_SECTION CriticalSection; 

int main( void )
{
    ...

    // Initialize the critical section one time only.
    if (!InitializeCriticalSectionAndSpinCount(&CriticalSection, 
        0x00000400) ) 
        return;
    ...

    // Release resources used by the critical section object.
    DeleteCriticalSection(&CriticalSection);
}

DWORD WINAPI ThreadProc( LPVOID lpParameter )
{
    ...

    // Request ownership of the critical section.
    EnterCriticalSection(&CriticalSection); 

    // Access the shared resource.

    // Release ownership of the critical section.
    LeaveCriticalSection(&CriticalSection);

    ...
return 1;
}