TigerCow.Door

CriticalSection에 대해서 공부하다가 의문점이 들어 알아보았습니다.


만약 1,2,3,4 라는 4개의 스레드가 존재했을 때, 1의 스레드에서 EnterCriticalSection을 두번 호출하고 LeaveCriticalSection을 한번 호출하면 2의 스레드에서 EnterCriticalSection을 호출하면 어떻게 되고 그 이유는 무엇일까요?


먼저 결과적으로는 2의 스레드에서 EnterCriticalSection을 호출하면 block처리가 됩니다.

이유를 한번 알아보겠습니다.

먼저 microsoft 공식문서에 업데이트된 Displaying a Critical Section을 통해 CriticalSection의 내부 구조를 살펴보면, lockCount와 OwningThread 멤버가 있는 것을 확인할 수 있습니다.

(출처: https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/displaying-a-critical-section)


즉, Critical Section은 자신이 어떤 스레드에 의해 소유되어져 있고, 해당 스레드에 의해 몇번 lock이 되었는지 알고 있는 것입니다.

따라서 Critical Section을 소유한 스레드가 EnterCriticalSection을 호출하면 개체 내부적으로 lockCount가 하나 증가합니다.

다시말해, EnterCriticalSection을 호출한 회수 만큼 LeaveCriticalSection을 호출해야지만 lockCount가 0이되어 CriticalSection이 Signaled 상태로 돌아오게 됩니다.


예를 들어, EnterCriticalSection을 두번 호출하고 LeaveCriticalSection을 한번만 호출한다면 lockCount는 1이됨으로써 결국 EnterCriticalSection만 한번 호출한것과 같은 상태가 되는 것 입니다.

블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc