CRITICAL_SECTION 은 구조체로 선언되어 있는데.
CRITICLA_SECTION 을 동적 할당하고 그것을 다른 쓰레드에서 delete 했을때
자동으로 LeaveCriticalSection 이 호출 될까..
사실 소멸자같은게 없으니까 당연한 거였을지도 모르겠다..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #include <iostream> #include <set> #include <vector> #include <map> #include <Windows.h> #include <thread> using namespace std; DWORD WINAPI Test(LPVOID pParam) { CRITICAL_SECTION* tempCritical = (CRITICAL_SECTION*)pParam; if (tempCritical) { delete tempCritical; tempCritical = NULL; } return 0; } DWORD WINAPI Test2(LPVOID pParam) { CRITICAL_SECTION* tempCritical = (CRITICAL_SECTION*)pParam; EnterCriticalSection(tempCritical); cout << "Critical Section Lock Count : " << tempCritical->LockCount << endl; return 0; } int main() { CRITICAL_SECTION* cs = new CRITICAL_SECTION; InitializeCriticalSection(cs); EnterCriticalSection(cs); thread test(Test, (LPVOID)cs); test.join(); cout << "Critical Section Lock Count : " << cs->LockCount << endl; thread test2(Test2, (LPVOID)cs); test2.join(); return 0; } | cs |
원래 EnterCriticalSection 을 한번 걸게 되면 초기 상태는 -1 인데 -1 -> -2 로 이루어진다.
LeaverCriticalSection 은 -2 -> -1 로 가게된다.
그렇다고 해서 EnterCri ~ 또는 LeaveCri ~ 를 많이 한다고해서 -2 , -3 , -4 or 0 , 1, 2 숫자가 계속 올라가는 것은 아니였음.
그런데 삭제하고 나니 쓰레기 값이 도출 됬고 EnterCritical을 호출하니 Lock 이 걸리지 않고 넘어갔고 쓰레기값에서 -1 을 한 값이 도출됬다.
CRITICAL_SECTION 의 구조체변수 LockCount 와 RecursiveCount 에 대한 실험 결과 ->
LockCount 는 Initialize 를 하면 -1
현재 스레드에서 EnterCriticalSection 을 하면 -2
이 상태에서 LeaveCriticalSection 을 하지 않고 다른 스레드에서 EnterCriticalSection 시 -6
한번 더 반복시 -10
한번 더 반복시 -14
즉 다른 스레드에서 EnterCriticalSection을 호출시 -4 씩 증가 하게 된다.
하지만 CRITICAL_SECTION을 호출한 스레드에서 한번더 EnterCriticalSection을 호출한다고 해서 -4 가 증가하진 않았다.
하지만 RecursionCount 가 1 증가하게 됬다.
'시스템프로그래밍' 카테고리의 다른 글
winapi를 통한 Mutex 와 std::recursive_mutex를 통한 동기화 차이 (0) | 2018.11.27 |
---|---|
간단한 채팅서버 구현시 오류났던 부분 (0) | 2018.05.30 |
이벤트를 사용한 예제 (0) | 2018.05.26 |
뮤텍스와 크리티컬섹션을 이용한 기본 예제 (0) | 2018.05.26 |
크리티컬 섹션과 파일입출력을 통한 기본예제.. (0) | 2018.05.26 |