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 증가하게 됬다.



+ Recent posts