"c++ 데드락"에 해당되는 글 - 1건
Post
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(NULL, 0, threadInc, NULL, 0, NULL); ++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을주석처리해서 다른 쓰레드가 접근하지 못하게 했다.
내가 이해안가던게, 크리티컬 섹션에 접근을 못하는 건지, 해당 변수에 접근을 못해서
데드락이 걸리는건지 헷갈렸는데..
크리티컬 섹션을 꼼꼼히 안해주면 크리티컬 섹션 효과를 못보니까 크리티컬 섹션에 접근을 못해서 문제인 듯.
'이전게시판 > C, C++' 카테고리의 다른 글
C++ 11 람다식(Lamda)이란 - 1 (0) | 2016.06.19 |
---|---|
IOCP 소켓 종료 상황 (0) | 2016.04.21 |
CRT 메모리 누수 체크 (0) | 2016.04.15 |
C++ 다중상속 문제점? (0) | 2016.04.04 |
2의 보수 만드는 법 (0) | 2016.04.01 |
구조체 패딩이란? (0) | 2016.03.31 |
C++ 스택(Stack) 예제 (0) | 2016.03.20 |
C++ 간단한 원형 큐 (0) | 2016.03.20 |