À©µµ¿ìÁî ¸ÖÆ¼ ¾²·¹µå ÇÁ·Î±×·¡¹Ö
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

Contents

1 À©µµ¿ìÁî ¾²·¹µå ÇÁ·Î±×·¡¹Ö
1.1 Ä¿³Î ¿ÀºêÁ§Æ®
1.2 ¾²·¹µå »ý¼º
1.2.1 CreateThread
1.2.2 _beginthread, _beginthreadex
2 ¿¹Á¦
3 ¾²·¹µå °ü·Ã ¹®¼­

1 À©µµ¿ìÁî ¾²·¹µå ÇÁ·Î±×·¡¹Ö

Thread ±âº» °³³äÀº ¸®´ª½º¿¡¼­¿Í º°´Ù¸¦ °ÍÀÌ ¾ø´Ù´Â »ý°¢ÀÌ´Ù. ¾²·¹µå »ý¼º -> ¿î¿ë -> Á¾·á °ü·Ã ÇÔ¼ö´Â ¸®´ª½º¿Í Å« Â÷À̰¡ ¾øÀ» °Å¶ó°í »ý°¢µÇ´Ï, pthread Á¦°ø ÇÔ¼öµé°ú ºñ±³Çϸ鼭 °øºÎÇØ³ª°¡¸é µÉ °Í °°´Ù. ¾î´ÀÁ¤µµ ÀûÀÀÀÌ µÇ¸é, µ¿±âÈ­ ÂÊ ¹®¼­¸¦ º¸¸é µÇÁö ¾ÊÀ»±î ½Í´Ù.

1.1 Ä¿³Î ¿ÀºêÁ§Æ®

Ä¿³Î¿¡¼­ »ý¼ºÇÑ °´Ã¼·Î ½Ã½ºÅÛ ¸®¼Ò½ºÀÇ Á¤º¸¸¦ ´ã°í ÀÖ´Â µ¥ÀÌÅÍ ºí·ÏÀÌ´Ù. Ä¿³Î¿¡¼­ ÇÁ·Î¼¼½º ȤÀº ¾²·¹µå¸¦ Á¦¾îÇϱâ À§ÇØ »ç¿ëÇÏ´Â Á¤º¸ µ¥ÀÌÅÍ ºí·°ÀÌ´Ù. ¸®´ª½ºÈ¯°æ¿¡¼­ ÇÁ·Î±×·¡¹Ö ÇÏ´Ù°¡ Ä¿³Î ¿ÀºêÁ§Æ®¶ó´Â ¿ë¾î¸¦ ¸¸³ª¼­ »ý¼ÒÇß¾ú´Ù. ¸®´ª½º Ä¿³Î¿¡¼­ °ü¸®ÇÏ´Â ÆÄÀÏ, ¼ÒÄÏ, ¼¼¸¶Æ÷¾î, ¹ÂÅØ½º(mutex), ½Ã±×³Î µîÀ» Ä¿³Î ¿ÀºêÁ§Æ®¶ó°í º¸¸é µÈ´Ù.

À©µµ¿¡¼­ Ä¿³ÎÀÇ ¿ÀºêÁ§Æ®¸¦ °¡¸®Å°´Â °´Ã¼¸¦ ÇÚµéÀ̶ó°í ÇÑ´Ù. ¿ª½Ã ¸®´ª½º¿Í ¿ë¾î°¡ Ʋ¸± »ÓÀÌ´Ù. ¸ðµç °ÍÀ» ÆÄÀÏ·Î ´Ù·ç´Â ¸®´ª½º¿¡¼­´Â ÆÄÀÏ ÁöÁ¤ ¹øÈ£°¡ Ä¿³Î ¿ÀºêÁ§Æ®¸¦ °¡¸®Å°´Â ÇÚµéÀÇ ¿ªÇÒÀ» ÇÑ´Ù.

´ÙÀ½Àº À©µµ Ä¿³Î ¿ÀºêÁ§Æ®ÀÇ Á¾·ù´Ù.
  • À̺¥Æ® ¿ÀºêÁ§Æ®
  • ÆÄÀÏ ¿ÀºêÁ§Æ®
  • I/O Æ÷Æ® ¿ÀºêÁ§Æ®
  • ÆÄÀÌÇÁ ¿ÀºêÁ§Æ®
  • ¼¼¸¶Æ÷ ¿ÀºêÁ§Æ®
  • ¾²·¹µå ¿ÀºêÁ§Æ®
  • ÇÁ·Î¼¼½º ¿ÀºêÁ§Æ®
  • ¹ÂÅØ½º ¿ÀºêÁ§Æ®
  • ¸ÞÀÏ ½½·Ô ¿ÀºêÁ§Æ®

Ä¿³Î ¿ÀºêÁ§Æ®¸¦ ¸¸µå´Â ÇÔ¼ö´Â Create·Î ½ÃÀÛÇÑ´Ù. CreateFile, CreateThread, CreateProcess, CreatePipe.. µîÀÌ´Ù. À̵é ÇÔ¼ö´Â °øÅëÀûÀ¸·Î ÇÚµéÀ» (¹Ýȯ °ª ȤÀº ¸Å°³ º¯¼ö·Î)¹ÝȯÇÑ´Ù.

1.2 ¾²·¹µå »ý¼º


1.2.1 CreateThread

  • Createthread()ÇÔ¼ö·Î ¾²·¹µå¸¦ »ý¼ºÇÑ´Ù. °¡´ÉÇϸé CreatethreadÇÔ¼ö¸¦ ¾²Áö¸»¶ó°í ±ÇÀåÇÑ´Ù.
  • pthread : pthread_create()
  • win32 thread : HANDLE WINAPI CreateThread
    ´ëÃæ pthread_createÇÔ¼ö¿Í ºñ½ÁÇØ º¸À̱ä ÇØ¼­ ´ÙÇàÀÌ´Ù.
HANDLE WINAPI CreateThread( 
  __in_opt   LPSECURITY_ATTRIBUTES lpThreadAttributes, 
  __in       SIZE_T dwStackSize, 
  __in       LPTHREAD_START_ROUTINE lpStartAddress, 
  __in_opt   LPVOID lpParameter, 
  __in       DWORD dwCreationFlags, 
  __out_opt  LPDWORD lpThreadId 
); 
 

1.2.2 _beginthread, _beginthreadex

»õ·Î¿î ¾²·¹µå¸¦ ¸¸µç´Ù. CreateThread¿Í À¯»çÇÏÁö¸¸ ´ÙÀ½ÀÇ Â÷ÀÌÁ¡ÀÌ ÀÖ´Ù.
  • ¾²·¹µå¿¡ ¿©·¯ Àμö¸¦ Àü´ÞÇÒ ¼ö ÀÖ´Ù.
  • ƯÁ¤ÇÑ C ·±Å¸ÀÓ ¶óÀ̺귯¸® º¯¼ö¸¦ ÃʱâÈ­ ÇÑ´Ü´Ù.. ÀÌ°Ô ¹«½¼ ÀǹÌÀÎÁö Á» ¾Ë¾ÆºÁ¾ß °Ú´Ù.
  • CreateThread´Â º¸¾ÈƯ¼ºÀ» Á¦¾îÇÑ´Ù. ÀÌ ÇÔ¼ö·Î ÀϽà Áß´ÜµÈ »óÅ¿¡¼­ ¾²·¹µå¸¦ ½ÃÀÛÇÒ ¼ö ÀÖ´Ü´Ù. ¿ª½Ã ¹«½¼ ÀǹÌÀÎÁö ¾Ë¾ÆºÁ¾ß °Ú´Ù. ¿ÖÀ̸® ¸»µéÀÌ Çê°¥¸®³Ä.

_beginthreadÇÔ¼ö´Â ¾²·¹µå¸¦ »ý¼ºÇÏÀÚ ¸»ÀÚ ÇÚµéÀ» ´Ý¾Æ ¹ö¸®±â ¶§¹®¿¡, °ÅÀÇ »ç¿ëÇÏÁö ¾Ê´Â´Ù.

2 ¿¹Á¦

#include <windows.h>  
#include <tchar.h>  
#include <strsafe.h>  
  
#define MAX_THREADS 3  
#define BUF_SIZE 255  
  
DWORD WINAPI MyThreadFunction( LPVOID lpParam );  
void ErrorHandler(LPTSTR lpszFunction);  
  
/*  
  ¾²·¹µå¿¡ ³Ñ°Ü ÁÙ °£´ÜÇÑ À¯Àú ¾²·¹µå µ¥ÀÌÅÍ  
 */  
typedef struct MyData {  
    int val1;  
    int val2;  
} MYDATA, *PMYDATA;  
  
  
int _tmain()  
{  
    PMYDATA pDataArray[MAX_THREADS];  
    DWORD   dwThreadIdArray[MAX_THREADS];  
    HANDLE  hThreadArray[MAX_THREADS];   
  
    // Create MAX_THREADS worker threads.  
  
    for( int i=0; i<MAX_THREADS; i++ )  
    {  
        // ¾²·¹µå µ¥ÀÌÅ͸¦ À§ÇÑ ¸Þ¸ð¸® ÇÒ´ç  
        pDataArray[i] = (PMYDATA) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,  
                sizeof(MYDATA));  
  
        if( pDataArray[i] == NULL )  
        {  
            // ¸Þ¸ð¸® ÇÒ´ç¿¡ ½ÇÆÐÇϸé Á¾·áÇÑ´Ù.  
            ExitProcess(2);  
        }  
  
        // °¢ ¾²·¹µå¿¡ ³Ñ°Ü ÁÙ µ¥ÀÌÅÍÀÇ °ªÀ» ¼³Á¤ÇÑ´Ù.  
        pDataArray[i]->val1 = i;  
        pDataArray[i]->val2 = i+100;  
  
        // ¾²·¹µå¸¦ »ý¼ºÇÑ´Ù.  
        hThreadArray[i] = CreateThread(   
            NULL,                   // default security attributes  
            0,                      // use default stack size    
            MyThreadFunction,       // thread function name  
            pDataArray[i],          // argument to thread function   
            0,                      // use default creation flags   
            &dwThreadIdArray[i]);   // returns the thread identifier   
  
        // ¾²·¹µå°¡ ¼º°øÀûÀ¸·Î »ý¼ºµÇ¾ú´ÂÁö¸¦ È®ÀÎÇÑ´Ù.  
        // »ý¼º¿¡ ½ÇÆÐÇϸé ÇÁ·Î¼¼½º¸¦ Á¾·áÇÑ´Ù.  
        if (hThreadArray[i] == NULL)   
        {  
           ErrorHandler(TEXT("CreateThread"));  
           ExitProcess(3);  
        }  
    }  
  
    // ¾²·¹µå Á¾·á¸¦ ±â´Ù¸°´Ù.  
    WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);  
  
    // ¸ðµç ¾²·¹µå Çڵ鷯¸¦ ´Ý°í, ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÑ´Ù.  
    for(int i=0; i<MAX_THREADS; i++)  
    {  
        CloseHandle(hThreadArray[i]);  
        if(pDataArray[i] != NULL)  
        {  
            HeapFree(GetProcessHeap(), 0, pDataArray[i]);  
            pDataArray[i] = NULL;   
        }  
    }  
  
    return 0;  
}  
  
  
// ¾²·¹µå ÇÔ¼ö  
DWORD WINAPI MyThreadFunction( LPVOID lpParam )   
{   
    HANDLE hStdout;  
    PMYDATA pDataArray;  
  
    TCHAR msgBuf[BUF_SIZE];  
    size_t cchStringSize;  
    DWORD dwChars;  
  
    // Ç¥ÁØÃâ·ÂÀ» Á¦¾îÇϱâ À§ÇÑ ÄܼÖÀ» ¸¸µç´Ù.  
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);  
    if( hStdout == INVALID_HANDLE_VALUE )  
        return 1;  
  
    // Cast the parameter to the correct data type.  
    // The pointer is known to be valid because   
    // it was checked for NULL before the thread was created.  
     pDataArray = (PMYDATA)lpParam;  
  
    // Print the parameter values using thread-safe functions.  
    StringCchPrintf(msgBuf, BUF_SIZE, TEXT("Parameters = %d, %d\n"),   
        pDataArray->val1, pDataArray->val2);   
    StringCchLength(msgBuf, BUF_SIZE, &cchStringSize);  
    WriteConsole(hStdout, msgBuf, (DWORD)cchStringSize, &dwChars, NULL);  
  
    return 0;   
}   
  
  
  
void ErrorHandler(LPTSTR lpszFunction)   
{   
    // Retrieve the system error message for the last-error code.  
  
    LPVOID lpMsgBuf;  
    LPVOID lpDisplayBuf;  
    DWORD dw = GetLastError();   
  
    FormatMessage(  
        FORMAT_MESSAGE_ALLOCATE_BUFFER |   
        FORMAT_MESSAGE_FROM_SYSTEM |  
        FORMAT_MESSAGE_IGNORE_INSERTS,  
        NULL,  
        dw,  
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),  
        (LPTSTR) &lpMsgBuf,  
        0, NULL );  
  
    // Display the error message.  
  
    lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,   
        (lstrlen((LPCTSTR) lpMsgBuf) + lstrlen((LPCTSTR) lpszFunction) + 40) * sizeof(TCHAR));   
    StringCchPrintf((LPTSTR)lpDisplayBuf,   
        LocalSize(lpDisplayBuf) / sizeof(TCHAR),  
        TEXT("%s failed with error %d: %s"),   
        lpszFunction, dw, lpMsgBuf);   
    MessageBox(NULL, (LPCTSTR) lpDisplayBuf, TEXT("Error"), MB_OK);   
  
    // Free error-handling buffer allocations.  
  
    LocalFree(lpMsgBuf);  
    LocalFree(lpDisplayBuf);  
}  
 

3 ¾²·¹µå °ü·Ã ¹®¼­

 
À̸§
Á¦¸ñ
º¯°æÀÏ
Å©±â
À©µµ ¾²·¹µå ÇÁ·Î±×·¡¹Ö : µ¿±âÈ­
2010/03/03 16:01
2157

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.