본문 바로가기

Study/Programming

윈도우 쓰레드 동기화 CRITICAL_SECTION - 꼬로미

부르르2


안녕하세요 꼬로미입니다


윈도우 쓰레드 동기화에 대한 포스팅입니다


CRITICAL_SECTION 기반 동기화



유저모드(User mode) 커널모드(Kernel mode)

유저모드 : 응용 프로그램이 실행되는 기본모드로, 물리적인 영역으로의
                  접근이 허용되지 않으며 접근할 수 있는 메모리의 영역에도 제한이 따름

                  (응용프로그램의 실행모드)

커널모드 : 운영체제가 실행될 떄의 모드이며 메모리뿐 아니라 하드웨어의 접근에도 제한이 따르지 않음

              (운영체제의 실행모드)


유저모드 동기화

운영체제에 의해서 이뤄지는 동기화가 아닌, 순수 라이브러리에 의존해서 완성되는 동기화 기법

운영체제에 의해서 제공되지 않으므로 커널모드로의 전환이 불필요 ( 상대적으로 가볍고 속도가 빠름)


커널모드 동기화

커널모드 동기화는 커널에 의해서 제공이 되는 동기화 기법

커널에 의해 제공되는 동기화이다 보니, 다양한 기능이 제공.

한가지 예로 Dead-lock에 걸리지 않도록 타임아웃을 지정할 수 있음




CRITICAL_SECTION 

유저모드에만 동작 (커널 오브젝트가 아님)

임계영역의 진입을 위해 CRITICAL_SECTION 오브젝트 열쇠(key)를 얻는 방식

  • CS 오브젝트 초기화 및 소멸과 관련된 함수

InitializeCriticalSection(&cs);
DeleteCriticalSection(&cs);

  • 열쇠의 획득 및 반납에 대한 함수

EnterCriticalSection(&cs);

LeaveCriticalSection(&cs);




CRITICAL_SECTION 기반 동기화 예제


#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;


InitializeCriticalSection(&cs);

for(i=0; i<NUM_THREAD; i++)

{

if(i%2)

tHandles[i]=(HANDLE)_beginthreadex(NULL, 0, threadInc, NULL, 0, NULL);

else

tHandles[i]=(HANDLE)_beginthreadex(NULL, 0, threadDes, NULL, 0, NULL);

}

WaitForMultipleObjects(NUM_THREAD, tHandles, TRUE, INFINITE);

DeleteCriticalSection(&cs);

printf("result: %11d \n", num);

return 0;

}


unsigned WINAPI threadInc(void * arg)

{

int i;

EnterCriticalSection(&cs);

for(i=0; i<150; i++)

num+=1;

LeaveCriticalSection(&cs);

return 0;

}


unsigned WINAPI threadDes(void * arg)

{

int i;

EnterCriticalSection(&cs);

for(i=0; i<100; i++)

num-=1;

LeaveCriticalSection(&cs);

return 0;

}

 







읽어주셔서 감사드립니다^^*