이전게시판/C, C++

C++ 데드락(DeadLock)

ㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇ 2016. 4. 4. 13:17
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
50
51
#include <stdio.h>
#include <windows.h>
#include <process.h>
 
#define NUM_THREAD 50
unsigned WINAPI threadInc(void* arg);
unsigned WINAPI threadDes(void* arg);
 
long long num = 0;
CRITICAL_SECTION cs;
 
int main(int argc, char* argv[])
{
    HANDLE tHandles[NUM_THREAD];
    int i = 0;
 
    InitializeCriticalSection(&cs);
    
    for(int j = 0; j < 2++j)
    {
        tHandles[i] = (HANDLE)_beginthreadex(NULL0, threadInc, NULL0NULL);
        ++i;
    }
    DWORD returnMessage = WaitForMultipleObjects(2, tHandles, TRUE, INFINITE);
    DeleteCriticalSection(&cs);
    printf("result:%d \n", num);
    return 0;
}
 
unsigned WINAPI threadInc(void* arg)
{
    int i;
    EnterCriticalSection(&cs);
    for(i = 0; i<1000++i)
    {
        num+=1;
        printf("num:%d i:%d \n", num, i); 
    }
    //LeaveCriticalSection(&cs);
    return 0;
}
 
unsigned WINAPI threadDes(void* arg)
{
    int i;
    EnterCriticalSection(&cs);
    for(i = 0; i<1000000++i)
        num-=1;
    //LeaveCriticalSection(&cs);
    return 0;
}
cs


윤성우의 TCP/IP책으로 공부를 하고 있다.

데드락에 대한 예제를 찾기가 어려웠다.

예전에는 데드락이 의도치 않게 잘 일어났었는데... 지금은 잘안됨 ㅋㅋ

일단 허접하게 LeaveCriticalSection을주석처리해서 다른 쓰레드가 접근하지 못하게 했다. 


내가 이해안가던게, 크리티컬 섹션에 접근을 못하는 건지, 해당 변수에 접근을 못해서

데드락이 걸리는건지 헷갈렸는데..

크리티컬 섹션을 꼼꼼히 안해주면 크리티컬 섹션 효과를 못보니까 크리티컬 섹션에 접근을 못해서 문제인 듯.