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만 한번 호출한것과 같은 상태가 되는 것 입니다.
'OS&네트워크' 카테고리의 다른 글
[네트워크] 라우팅 알고리즘(Routing algorithm), 다익스트라 알고리즘(Dijkstra algorithm) (2) | 2017.11.14 |
---|---|
[네트워크] OSI 7 계층 모델 (4) | 2017.11.13 |
운영체제 #3_ 상호잠금, InterlockedIncrement 함수 (0) | 2017.11.09 |
운영체제 #2_ C언어를 통한 스레드/멀티스레드 예제 (2) | 2017.10.26 |
운영체제 #1_ 스레드와 프로세스, 멀티프로그래밍,멀티태스킹,멀티스레딩,멀티프로세싱 (2) | 2017.10.26 |