정성훈
    쓰레드 동기화(커널모드1. Mutex)
mutex_dstruct_ex1 [3 KB]    
  http://cluster1.cafe.daum.net/_c21_/bbs_search_read?grpid=1D1MR&fldid=1IwS&datanum=29&openArticle=true&docid=1D1MR1IwS2920080222131940



쓰레드 동기화(커널모드1. Mutex)

 

커널모드에는 Mutex, Semaphore, Event 가 있다.

 

[Mutex]

 

- Mutex 커널 오브젝트를 이용한 동기화 방법 CRITICAL_SECTION 과 유사하다.

  // 문을 열기 전에 Mutex 를 얻고  문을 나가면서 Mutex 를 반환한다.. (화장실 개념)

Semaphore 나 CRITICAL_SECTION 에 비해 더욱 강화된 기능을 가졌다. 하지만 사용이 까다롭고 다소 느리다는 점이 있다.

 

signaled 상태       : 소유가 가능한 상태 (임계영역 에 들어가기전)

non-signaled 상태 : 이미 소유되어진 상태 (임계영역에 있는 경우)

 

HANDLE CreateMutex(

           LPSECURITY_ATTRIBUTES lpMutexAttributes,        // SECURITY_ATTRIBTES 구조체 주소, NULL 을 사용할수 있다. 이경우 디폴트 값

           BOOL blnitialOwner,                                         // Mutex 최초 수유자를 지정한다. TRUE 이면 쓰레드 호출하는 순간 소유권획득 . FALSE 반대

           LPCTSTR lpName                                             // Mutex 객체의 아이디 지정. NULL 로 끝나는 길이 MAX_PATH 이내의 문자열

) ;

 

Mutex 객체를 생성하는 함수이다. 성공시 Mutex 객체의 핸들을 리턴해주고 이미 해당 아이디로 지정된 Mutex 가 생성되었다면 ERROR_ALREDY_EXISTS 를 리턴

 

 

BOOL ReleaseMutex(

           HANDLE hMutex ;                                            // 소유권을 해제할 Mutex 객체의 핸들   non-signaled-> signaled

} ;

 

인자로 주어진 Mutex 객체의 소유권을 해제한다. 성공할경우 0 이 아닌 값을 리턴한다.

 

BOOL CloseHandle(

           HANDLE hObject ;                                           // Mutex 소멸

} ;

 

 

#include

#include

#include

 

DWORD WINAPI ThreadFunc( void* arg ) ;

 

char thread1[] = "A Thread" ;

char thread2[] = "B Thread" ;

int number = 0 ;

 

HANDLE hMutex ;                                                           // Mutex 생성시 핸들을 저장하기 위한 변수. 쓰레들에 의해서 공유되므로 반드시 전역변수.

 

void main()

{

     HANDLE hThread1, hThread2 ;

     DWORD dwThreadID1, dwThreadID2 ;

 

     hMutex = CreateMutex( NULL, FALSE, NULL ) ;                // Mutex 오브젝트 생성. 생성시 핸들을 리턴. 현재 FALSE : signaled 상태

 

     if( hMutex == NULL )     puts( "뮤텍스 오브젝트 생성 실패" ) ;

 

     hThread1 = (HANDLE)_beginthreadex( NULL, 0, (unsigned int (_stdcall *)(void *) )ThreadFunc,

                                                           (void*)thread1, 0, (unsigned*)&dwThreadID1 ) ;

     hThread2 = (HANDLE)_beginthreadex( NULL, 0, (unsigned int (_stdcall *)(void *) )ThreadFunc,

                                                           (void*)thread2, 0, (unsigned*)&dwThreadID2 ) ;

 

     if( hThread1 == 0 || hThread2 == 0 )

     {

          puts( "_beginthreadex error" ) ;

          exit( 1 ) ;

     }     

 

     if( WaitForSingleObject( hThread1, INFINITE ) == WAIT_FAILED )     puts( "쓰레드 wait 오류" ) ;

     if( WaitForSingleObject( hThread2, INFINITE ) == WAIT_FAILED )     puts( "쓰레드 wait 오류" ) ;

 

     printf( "최종 number : %dn", number ) ;

 

     CloseHandle( hMutex ) ;                                            // Mutex 오브젝트 소멸

}

 

DWORD WINAPI ThreadFunc( void* arg )

{

     for( int i = 0 ; i < 5 ; i++ )

     {

          WaitForSingleObject( hMutex, INFINITE ) ;                // Mutex 를 얻는다.(키를 얻는다)

          // 임계영역

          Sleep(100) ;                                                      // 두개의 쓰레드가 번갈아 가면서 실행되도록 딜레이를 시킨다.

          number++ ;

          printf( "실행 : %s, number :%dn", (char*)arg, number ) ;

          ReleaseMutex( hMutex ) ;                                    // Mutex 를 반환한다. (키를 돌려준다)

     }

     return 0 ;

}

 

두개의 쓰레드가 하나의 함수에 동시에 접근한다. 이 함수는 임계영역이 된다. 동시에 접근하기 때문에 WaiFor.... 와 Realse... 로 처리해주는 소스이다.

 

 

  등록일 : 2014-06-10 [00:46] 조회 : 2008 다운 : 309   
 
△ 이전글Thead 의 사용
▽ 다음글Thead 의 개념
자료구조 팁
번호 제 목 이름 조회 등록일
18 게임개발 중 사용자 캐릭터 움직임 키보드 입력 시에만 배경이 움직일 때 처리 방법 함수 정성훈 11 12-05
17 (chatGPT) 구조체 local 변수 0으로 초기화 방법 함수 정성훈 23 11-28
16 이진탐색트리에서 삭제연산 설명 함수 정성훈 945 05-30
15 insert_node 실행 예제 함수 정성훈 1059 05-09
14 └❶ ppt 파일 함수 정성훈 874 05-09
13 lThead 의 사용 함수 정성훈 1459 06-10
12 └❶ lThead 죽이기 함수 정성훈 3117 06-16
11 └❶ lThead 의 개념 동작 정성훈 1807 06-10
10 └❶ l쓰레드 동기화(커널모드1. Mutex) 함수 정성훈 2008 06-10
9 음악 플레이 프로그램 함수 정성훈 1527 06-08
8 lgetchar(), getch(), getche() 차이 함수 정성훈 1398 10-19
7 fflush 사용이유 및 방법 함수 정성훈 1275 06-19
6 linked list 의 head pointer는 malloc이 필요하지 않음 동작 정성훈 1456 05-02
5 double pointer의 사용 동작 정성훈 1415 04-15
4 파일에 쓰기 및 파일에서 읽기 함수 정성훈 1454 04-01

[1][2]