¾²·¹µå µ¿±âÈ(Ä¿³Î¸ðµå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... ·Î ó¸®ÇØÁÖ´Â ¼Ò½ºÀÌ´Ù.