ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù. 1 À©µµ¿ìÁî ¾²·¹µå ÇÁ·Î±×·¡¹Ö
Thread ±âº» °³³äÀº ¸®´ª½º¿¡¼¿Í º°´Ù¸¦ °ÍÀÌ ¾ø´Ù´Â »ý°¢ÀÌ´Ù. ¾²·¹µå »ý¼º -> ¿î¿ë -> Á¾·á °ü·Ã ÇÔ¼ö´Â ¸®´ª½º¿Í Å« Â÷À̰¡ ¾øÀ» °Å¶ó°í »ý°¢µÇ´Ï, pthread Á¦°ø ÇÔ¼öµé°ú ºñ±³ÇÏ¸é¼ °øºÎÇØ³ª°¡¸é µÉ °Í °°´Ù. ¾î´ÀÁ¤µµ ÀûÀÀÀÌ µÇ¸é, µ¿±âÈ ÂÊ ¹®¼¸¦ º¸¸é µÇÁö ¾ÊÀ»±î ½Í´Ù. 1.1 Ä¿³Î ¿ÀºêÁ§Æ®
Ä¿³Î¿¡¼ »ý¼ºÇÑ °´Ã¼·Î ½Ã½ºÅÛ ¸®¼Ò½ºÀÇ Á¤º¸¸¦ ´ã°í ÀÖ´Â µ¥ÀÌÅÍ ºí·ÏÀÌ´Ù. Ä¿³Î¿¡¼ ÇÁ·Î¼¼½º ȤÀº ¾²·¹µå¸¦ Á¦¾îÇϱâ À§ÇØ »ç¿ëÇÏ´Â Á¤º¸ µ¥ÀÌÅÍ ºí·°ÀÌ´Ù. ¸®´ª½ºÈ¯°æ¿¡¼ ÇÁ·Î±×·¡¹Ö ÇÏ´Ù°¡ Ä¿³Î ¿ÀºêÁ§Æ®¶ó´Â ¿ë¾î¸¦ ¸¸³ª¼ »ý¼ÒÇß¾ú´Ù. ¸®´ª½º Ä¿³Î¿¡¼ °ü¸®ÇÏ´Â ÆÄÀÏ, ¼ÒÄÏ, ¼¼¸¶Æ÷¾î, ¹ÂÅØ½º(mutex), ½Ã±×³Î µîÀ» Ä¿³Î ¿ÀºêÁ§Æ®¶ó°í º¸¸é µÈ´Ù.
À©µµ¿¡¼ Ä¿³ÎÀÇ ¿ÀºêÁ§Æ®¸¦ °¡¸®Å°´Â °´Ã¼¸¦ ÇÚµéÀ̶ó°í ÇÑ´Ù. ¿ª½Ã ¸®´ª½º¿Í ¿ë¾î°¡ Ʋ¸± »ÓÀÌ´Ù. ¸ðµç °ÍÀ» ÆÄÀÏ·Î ´Ù·ç´Â ¸®´ª½º¿¡¼´Â ÆÄÀÏ ÁöÁ¤ ¹øÈ£°¡ Ä¿³Î ¿ÀºêÁ§Æ®¸¦ °¡¸®Å°´Â ÇÚµéÀÇ ¿ªÇÒÀ» ÇÑ´Ù.
´ÙÀ½Àº À©µµ Ä¿³Î ¿ÀºêÁ§Æ®ÀÇ Á¾·ù´Ù.
1.2 ¾²·¹µå »ý¼º1.2.1 CreateThread
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¿Í À¯»çÇÏÁö¸¸ ´ÙÀ½ÀÇ Â÷ÀÌÁ¡ÀÌ ÀÖ´Ù.
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); } |
|
|
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|