À©µµ¿ì ÇÁ·Î±×·¡¹Ö ÀÚ·á |
---|
Á¦¸ñ | [MFC] Multi-Threading 1998/07/29 (16:39) |
À̸§ | swindler |
¹øÈ£ | 49 |
Á¶È¸ | 439 |
º»¹® |
À©µµ¿ìÁî´Â ÀÛ¾÷ÀÚ ½º·¹µå¿Í »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º ½º·¹µå µÎ Á¾·ùÀÇ ½º·¹µå¸¦ Á¦°øÇÑ´Ù. »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º ½º·¹µå´Â À©µµ¿ì¸¦ °¡Áö°í ÀÖ¾î ÀÚ½ÅÀÇ °íÀ¯ÇÑ ¸Þ½ÃÁö ·çÇÁ°¡ ÀÖ´Â ¹Ý¸é ÀÛ¾÷ÀÚ ½º·¹µå´Â À©µµ¿ì¸¦ °®Áö ¾ÊÀ¸¹Ç·Î ¸Þ½ÃÁö¸¦ ó¸®ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ´ÜÀÏ ½º·¹µå ¾îÇø®ÄÉÀ̼ǵµ ÇÑ°³ÀÇ ½º·¹µå(¸ÞÀÎ ½º·¹µå)¸¦ °®´Â´Ù´Â »ç½Ç°ú MFC¿¡¼ CWinThread·ÎºÎÅÍ CWinApp°¡ ÆÄ»ýµÈ´Ù´Â Á¡(¾îÇø®ÄÉÀ̼ÇÀÌ ¹Ù·Î ½º·¹µåÀÌ´Ù)À» ²À ±â¾ïÇÏÀÚ. ¸ÕÀú, ÀÛ¾÷ÀÚ ½º·¹µå¿¡ ´ëÇÏ¿© ¾Ë¾Æº¸ÀÚ. ÁÖ·Î ½Ã°£ÀÌ ¸¹ÀÌ °É¸®´Â °è»ê󸮿¡ ¸¹ÀÌ ÀÌ¿ëµÈ´Ù. ÀÛ¾÷ÀÚ ½º·¹µå¸¦ »ç¿ëÇϱâ À§Çؼ´Â ¸ÕÀú ½º·¹µåÀÇ ¸ÞÀÎ ÇÁ·Î±×·¥À» À§ÇÑ Àü¿ª ÇÔ¼ö¸¦ ÀÛ¼ºÇØ¾ß ÇÑ´Ù. ÀÌ Àü¿ª ÇÔ¼ö´Â UINT¸¦ ¸®ÅÏÇØ¾ß Çϸç, ÆĶó¸ÞÅÍ·Î ´ÜÀÏÀÇ 32ºñÆ®(LPVOID Çü)À» °¡Á®¾ß ÇÑ´Ù. ½º·¹µå°¡ °è»ê󸮸¦ ¼öÇàÇÑ ÈÄ Àü¿ªÇÔ¼ö°¡ ¸®Åϵɶ§ ½º·¹µå´Â Á¾·áµÇ¸ç ÇÁ·Î¼¼½º°¡ Á¾·áµÉ ¶§µµ ¿ª½Ã Á¾·áµÈ´Ù. ±×·¯³ª, ¸Þ¸ð¸® ´©ÃâÀ» ¸·±â À§ÇÏ¿© ÇÁ·Î¼¼½º ¤¸Á¾·áÀü¿¡ ÀÛ¾÷ÀÚ ½º·¹µå°¡ Á¾·áµÇµµ·Ï ÇÏ´Â °ÍÀÌ ¹Ù¶÷Á÷ÇÏ´Ù. CWinThread *pThread=AfxBeginThread( ComputeThreadProc,GetSafeHwnd(),THREAD_PRIORITY_NORMAL); //GetSafeHwnd()´Â ÇöÀç À©µµ¿ìÀÇ ÇÚµéÀ» ¾ò´Â´Ù. UINT ComputeThreadProc(LPVOID pParam) { // ½º·¹µå ó¸®ÀÛ¾÷ÀÌ µé¾î°£´Ù. } AfxBeginThread()´Â »õ·Ó°Ô »ý¼ºµÈ ½º·¹µå °´Ã¼ÀÇ Æ÷ÀÎÅ͸¦ ¹Ù·Î ¸®ÅÏÇÑ´Ù. ÀÌ Æ÷ÀÎÅ͸¦ ÀÌ¿ëÇÏ¿© º¸·ù,Àç½ÃÀÛ (CWinThread::SuspendThread, ResumeThread)ÇÒ ¼ö ÀÖÁö¸¸ ½º·¹µå¸¦ »èÁ¦ ÇÒ ¼ö ¾ø´Ù. 1. ¸ÞÀÎ ½º·¹µå´Â ÀÛ¾÷ÀÚ ½º·¹µå¿Í ¾î¶»°Ô Åë½ÅÇϴ°¡? ÀÛ¾÷ÀÚ ½º·¹µå°¡ ¸Þ½ÃÁö ·çÇÁ¸¦ °®Áö ¾ÊÀ¸¹Ç·Î À©µµ¿ìÁî ¸Þ½ÃÁö¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ýÀº »ç¿ëÇÒ ¼ö ¾ø´Ù.°¡Àå °£´ÜÇÑ ¹æ¹ýÀº Àü¿ª º¯¼ö¸¦ ÀÌ¿ëÇÏ´Â °ÍÀÌ´Ù. º¯¼öÀÇ °ªÀÌ Æ¯Á¤°ªÀÌ µÇ¸é Á¾·áµÈ´Ù°í °¡Á¤Çϸé, ¸ÞÀÎ ½º·¹µå´Â Àü¿ª º¯¼ö°ªÀ» ƯÁ¤°ªÀ¸·Î ¼³Á¤ÇÏ¿© ÀÛ¾÷ÀÚ ½º·¹µå¸¦ Á¾·áÇÒ ¼ö ÀÖ´Ù. ¾î¼Àºí·¯»óÀÇ ¹®Á¦¿Í ·¹Áö½ºÅÍ º¯¼öÀÇ »ç¿ëÀ¸·Î ÀÎÇÏ¿©, Àü¿ªº¯¼öÀÇ °ª¿¡ ¹®Á¦°¡ ÀÖÀ» ¼ö ÀÖ´Ù. InterlockedIncrement((long *) &count); ¶ó°í Çϸé, º¯¼ö°¡ Áõ°¡µÇ´Â µ¿¾È ¾×¼¼½ºÇÏ·Á´Â ´Ù¸¥ ½º·¹µå¸¦ ¹À¸¹Ç·Î º¯¼ö°ªÀÌ Á¤»óÀûÀ¸·Î ÀÛµ¿ÇÏ°Ô µÈ´Ù. 2. ÀÛ¾÷ÀÚ ½º·¹µå´Â ¸ÞÀÎ ½º·¹µå¿Í ¾î¶»°Ô Åë½ÅÇϴ°¡? ÀÛ¾÷ÀÚ ½º·¹µå´Â À©µµ¿ìÁî ¸Þ½ÃÁö¸¦ ÀÌ¿ëÇÏ¿© ¸ÞÀÎ ½º·¹µå¿Í Åë½ÅÇÑ´Ù. Áï ¸ÞÀÎ ½º·¹µå´Â À©µµ¿ì¸¦ °®°Ô µÇ°í, ÀÛ¾÷ÀÚ ½º·¹µå´Â ±× À©µµ¿ìÀÇ ÇÚµéÀ» °®°Ô µÈ´Ù. ÀÛ¾÷ÀÚ ½º·¹µå°¡ À©µµ¿ì ÇÚµéÀ» °¡Áö°Ô Çϱâ À§Çؼ´Â AfxBeginThread()È£Ãâ½Ã 32ºñÆ® ÆĶó¸ÞÅÍ¿¡ À©µµ¿ì ÇÚµéÀ» Àü´ÞÇÏ¸é µÈ´Ù. (½º·¹µå´Â ½º·¹µå ÀÚ½ÅÀÌ »ý¼ºÇÑ °´Ã¼¿¡¸¸ Á¢±ÙÀÌ °¡´ÉÇϱ⠶§¹®¿¡ ´Ù¸¥ ½º·¹µå¿Í °´Ã¼¸¦ °øÀ¯Çϱâ À§Çؼ °´Ã¼ Æ÷ÀÎÅ͸¦ »ç¿ëÇÏ¸é °´Ã¼ÀÇ À¯È¿¼º °Ë»ç½Ã(ASSERT_VALID) ¿¡·¯°¡ ¹ß»ýÇϱ⠶§¹®¿¡ °´Ã¼ Æ÷ÀÎÅÍ ´ë½Å ÇÚµéÀ» »ç¿ëÇØ¾ß ÇÑ´Ù.) UINT ComputeThreadProc(LPVOID pParam) { ~ ::PostMessage((HWND) pParam, WM_THREADFINISHED,0,0); ~ return 0; // ½º·¹µå Á¾·á } |