Á¤¼ºÈÆ
    ¾²·¹µå µ¿±âÈ­(Ä¿³Î¸ðµå1. Mutex)
mutex_dstruct_ex1.txt [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] Á¶È¸ : 2079 ´Ù¿î : 329   
 
¡â ÀÌÀü±Ûppt ÆÄÀÏ
¡ä ´ÙÀ½±ÛThead Á×À̱â
ÀڷᱸÁ¶ ÆÁ
¹øÈ£ ¨Ï Á¦ ¸ñ À̸§ Á¶È¸ µî·ÏÀÏ
19 Dos Prompt â Å©±â Á¶Á¤ ¹æ¹ý ÇÔ¼ö Á¤¼ºÈÆ 42 01-01
18 °ÔÀÓ°³¹ß Áß »ç¿ëÀÚ Ä³¸¯ÅÍ ¿òÁ÷ÀÓ Å°º¸µå ÀÔ·Â ½Ã¿¡¸¸ ¹è°æÀÌ ¿òÁ÷ÀÏ ¶§ ó¸® ¹æ¹ý ÇÔ¼ö Á¤¼ºÈÆ 94 12-05
17 (chatGPT) ±¸Á¶Ã¼ local º¯¼ö 0À¸·Î ÃʱâÈ­ ¹æ¹ý ÇÔ¼ö Á¤¼ºÈÆ 113 11-28
16 ÀÌÁøŽ»öÆ®¸®¿¡¼­ »èÁ¦¿¬»ê ¼³¸í ÇÔ¼ö Á¤¼ºÈÆ 1066 05-30
15 insert_node ½ÇÇà ¿¹Á¦ ÇÔ¼ö Á¤¼ºÈÆ 1133 05-09
14 ¦¦❶ ppt ÆÄÀÏ ÇÔ¼ö Á¤¼ºÈÆ 935 05-09
13 lThead ÀÇ »ç¿ë ÇÔ¼ö Á¤¼ºÈÆ 1572 06-10
12 ¦¦❶ lThead Á×À̱â ÇÔ¼ö Á¤¼ºÈÆ 3244 06-16
11 ¦¦❶ lThead ÀÇ °³³ä µ¿ÀÛ Á¤¼ºÈÆ 1933 06-10
10 ¦¦❶ l¾²·¹µå µ¿±âÈ­(Ä¿³Î¸ðµå1. Mutex) ÇÔ¼ö Á¤¼ºÈÆ 2079 06-10
9 À½¾Ç Ç÷¹ÀÌ ÇÁ·Î±×·¥ ÇÔ¼ö Á¤¼ºÈÆ 1637 06-08
8 lgetchar(), getch(), getche() Â÷ÀÌ ÇÔ¼ö Á¤¼ºÈÆ 1514 10-19
7 fflush »ç¿ëÀÌÀ¯ ¹× ¹æ¹ý ÇÔ¼ö Á¤¼ºÈÆ 1373 06-19
6 linked list ÀÇ head pointer´Â mallocÀÌ ÇÊ¿äÇÏÁö ¾ÊÀ½ µ¿ÀÛ Á¤¼ºÈÆ 1563 05-02
5 double pointerÀÇ »ç¿ë µ¿ÀÛ Á¤¼ºÈÆ 1533 04-15

[1][2]