My Study/System

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
,

최근 댓글

최근 트랙백

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.