CreateSemaphore

ÇÑÁ¤µÈ ¸®¼Ò½º¸¦ °¢ ¾²·¹µåµé¿¡°Ô ºÐ¹èÇØ¾ß ÇÏ´Â °æ¿ì°¡ ÀÖ´Ù. ¾²·¹µå °³¼ö°¡ 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