ÇÑÁ¤µÈ ¸®¼Ò½º¸¦ °¢ ¾²·¹µåµé¿¡°Ô ºÐ¹èÇØ¾ß ÇÏ´Â °æ¿ì°¡ ÀÖ´Ù. ¾²·¹µå °³¼ö°¡ 3°³¹Û¿¡ ¾ø´Â °æ¿ì ¾²·¹µå 3°³¸¸ ÀÏ´Ü µ¹¸®°í, ³ª¸ÓÁö 7°³´Â ´ë±âÇÏ°í ÀÖ´Ù°¡, 3°³Áß¿¡ »ç¿ëÀÌ ³¡³ª¸é 7°³Áß¿¡ Çϳª°¡ »ç¿ëµÇ´Â ½ÄÀ¸·Î, ¼¼¸¶ Æ÷¾î´Â »ç¿ëµÇ´Â °¹¼ö¸¦ Á¶Á¤ÇÒ ¼ö°¡ ÀÖ´Ù.
À©µµ¿ìÁî¿¡¼ »ç¿ë ÇÒ ¼ö ÀÖ´Â ¼¼¸¶Æ÷¾î API¸¦ ´ÙÀ½ÀÇ ÇÔ¼ö·Î ¸¸µé¾ú´Ù. Àç »ç¿ëÀ» À§ÇÑ ¸ñÀûº¸´Ù, ¼³¸íÀ» À§ÇÑ ¸ñÀûÀ¸·Î ÇÔ¼ö·Î ¸¸µé¾ú´Ù.
HANDLE g_hSemaphore;
void CreateSemaphore()
{
g_hSemaphore = CreateSemaphore(NULL, 1, MAX_THREAD_NUM, NULL);
}
void LockSemaphore()
{
WaitForSingleObject(g_hSemaphore, INFINITE);
}
void UnLockSemaphore() //¸®¼Ò½º Ä«¿îÆ®¸¦
{
ReleaseSemaphore(g_hSemaphore, 1, NULL);
}
void CloseSemaphore()
{
CloseHandle(g_hSemaphore);
}
|
HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, //º¸¾È ¼Ó¼º, ÀϹÝÀûÀ¸·Î NULL ÁöÁ¤ LONG lInitialCount, //ÀӰ迵¿ª °¹¼ö LONG lMaximumCount, //ÀӰ迵¿ª Á¢±Ù °¹¼ö LPCTSTR lpName //Mutex ¿Í µ¿ÀÏÇÏ°Ô Name ÁöÁ¤ )
ÈÀå½Ç¿¡ ºñÀ¯ÇÏÀÚ¸é lInitialCount ÈÀå½Ç °¹¼ö, lMaximumCount ÈÀå½Ç¿¡ Á¢±Ù ÇÒ ¼ö ÀÖ´Â »ç¶÷ ¿©±â¼´Â MAX_THREAD_NUM, 3ÀÌ´Ù. (¿¹Á¦ ÇÁ·Î±×·¥À» ½ÇÇàÇØ º¸¸é, lInitialCount¿Í lMaximumCount °°Àº ¼ýÀÚ 1À» ³Ö¾îµµ ½ÇÇà¿¡´Â ¹®Á¦°¡ ¾ø´Ù.)
WaitForSingleObject(g_hSemaphore, INFINITE); ÈÀå½Ç¿¡ µé¾î°£´Ù. ¼¼¸¶Æ÷¾î Ä«¿îÆ®¸¦ °¨¼Ò ½ÃŲ´Ù. lInitialCount °ª¿¡¼ °¨¼Ò ½ÃŲ´Ù.. ¼¼¸¶Æ÷¾î Ä«¿îÆ®°¡ 0À̸é Lock »óÅ°¡ µÈ´Ù.
ReleaseSemaphore(g_hSemaphore, 1, NULL); ÈÀå½ÇÀ» ³ª¿Â´Ù, ¼¼¸¶Æ÷¾î Ä«¿îÆ®¸¦ Áõ°¡ ½ÃŲ´Ù.
CloseHandle(g_hSemaphore); ÇÁ·Î±×·¥ Á¾·á½Ã ¼¼¸¶Æ÷¾î¸¦ ÇØÁ¦ÇÑ´Ù.
DoThread() ¾²·¹µå ³»ºÎ¿¡¼´Â ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÑ´Ù.
unsigned int WINAPI DoThread( LPVOID lpData )
{
LockSemaphore();
static int count = 0;
count++;
OutputDebugPrintf( "***** Start Thread %d\n", count );
Sleep( 100 );
OutputDebugPrintf( "***** End Thread %d\n", count );
//À̺¥Æ®¿¡ ÀÇÇØ ¾²·¹µå Á¾·á¸¦ ¼³¸íÇϱâ À§ÇÑ ¿¹Á¦
for(int n=0; n < 100; ++n )
{
if( WaitForSingleObject( g_hStopEvent, 0 ) == WAIT_OBJECT_0 )
break;
}
UnLockSemaphore();
return 0;
}
|
¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù¸é ´ÙÀ½°ú °°ÀÌ °á°ú°¡ ³ª¿Ã°ÍÀÌ´Ù.
***** Start Thread 1 ***** Start Thread 2 ***** Start Thread 3 ***** End Thread 3 ***** End Thread 3 ***** End Thread 3 ¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇÏ¸é ´ÙÀ½°ú °°ÀÌ ¿øÇÏ´Â °á°ú°¡ ³ª¿Â´Ù.
***** Start Thread 1 ***** End Thread 1 ***** Start Thread 2 ***** End Thread 2 ***** Start Thread 3 ***** End Thread 3
¼Ò½º : SemaphoreMain.cpp
|