Critical Section(임계 영역) 개념
Critical Section(임계 영역)은 한개의 연산을 둘 이상의 쓰레드가 동시에 실행할 경우 발생할 수 있는 코드 블록이다.
[Value 라는 값에 2개의 쓰레드가 접근]
주의 해야할 점은 Value 라는 메모리 블록을 가리켜 임계 영역이라고 하는게 아니라 쓰레드 안에 있는 코드 블록이 임계 영역이 되는 것이다. 아래 예제 처럼 말이다.
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 52 53 54 55 56 | DOUBLE Count = 0; unsigned int WINAPI ThreadProc1(LPVOID lpParam) { for (DWORD i = 1; i <= 1000; i++) { Sleep(1); Count++; } return 0; } unsigned int WINAPI ThreadProc2(LPVOID lpParam) { for (DWORD i = 1; i <= 1000; i++) { Sleep(1); Count++; } return 0; } int _tmain() { //나머지 코드는 생략 for(DWORD i =0;i<2;i++) { if (i != 1) { hThread[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadProc1, NULL, 0, (unsigned *)&dwThreadID[i]); } else { hThread[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadProc2, NULL, 0, (unsigned *)&dwThreadID[i]); } if (hThread[i] == NULL) { _tprintf(_T("_beginthreadex funtion err : %lf\n"), GetLastError()); return -1; } } WaitForMultipleObjects(2, hThread, TRUE, INFINITE); } | cs |
예제를 보면 임계 영역은 7번째, 20번째 줄이 되겠다. 두 쓰레드에서 전역변수 Count 를 접근하고 있다. 위 코드를 읽어보면 2000이 나와야 하지만 2000이 안나오는 것을 확인할 수 있을 것이다. 이때 필요한 것이 동기화인데 이번 시간에는 그냥 간단히 방법만 소개하고 다음 글부터 설명 글을 써보겠다.
위 글을 클릭하시면 해당 글로 넘어갑니다.
'My Study > System' 카테고리의 다른 글
Critical Section(임계 영역) - Interlocked (0) | 2016.07.05 |
---|---|
Critical Section(임계 영역) - CRITICAL_SECTION (0) | 2016.07.04 |
Process Handle (0) | 2016.06.30 |
Kernel Object (0) | 2016.06.29 |
API Hooking x86 x64 (0) | 2016.05.23 |