Á¤¼ºÈÆ
    Thead Á×À̱â
¸ÖƼ¹Ìµð¾î Áö½Ä°øÀÛ¼Ò _ ¸ÖƼ¹Ìµð¾î Áö½Ä°øÀÛ¼Ò.pdf [618 KB]    
  http://multimedia.tistory.com/?page=2



1. Process¿Í Thread

¾²·¹µå¶ó´Â ³ðÀ» ÀÌÇØÇϱâ À§Çؼ± ÇÁ·Î¼¼½º¶õ ³ðÀ» ¸ÕÀú ÀÌÇØÇؾßÇÑ´Ù. ÇÁ·Î¼¼½º´Â EXE¶õ È®Àå¸íÀ» °¡Áö°í ÆÄÀÏÀ» ½ÇÇà½ÃÄ×À» ¶§ ½ÇÁúÀûÀ¸·Î ÄÄÇ»ÅÍÀÇ ¸Þ¸ð¸®¿¡ ÀÚ¸®Àâ°í ¾É¾Æ¼­ ½ÇÇàµÇ´Â ÇüŸ¦ ¸»ÇÑ´Ù. ¿¹¸¦ µé¸é ÇÁ·Î±×·¥À» ¸¶¿ì½º·Î ´õºíŬ¸¯Çϸé OS°¡ ±× ÇÁ·Î±×·¥À» ½ÇÇàÇϱâ À§ÇØ, ¾Ë¸Â°Ô ¸Þ¸ð¸®»ó¿¡ ±× ÇÁ·Î¼¼½º°¡ ½ÇÇà°¡´ÉÇÑ ¿µ¿ªÀ» Àâ¾ÆÁÖ°í(ÀÌ·± ¿µ¿ª¿¡´Â ¿©·¯°¡Áö ¿µ¿ªÀÌ ÀÖ´Ù.ÄÚµåºÎ or ½ºÅúÎ), ÇÁ·Î±×·¥Àº °Å±â¿¡ µé¾î¾É¾Æ¼­ ¿Â°® »ç¿ëÀÚÀÇ ¸í·ÉÀ» ´Ù ¹ÞÀ¸¸ç ÀÚ±âÀÇ ÀÏÀ» ¼öÇàÇÑ´Ù.

Áï, ÇÁ·Î¼¼½º´Â ¸Þ¸ð¸®¿¡ ÀûÀçµÈ »óÅ·Πµ¿ÀÛÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù.

 

ÇÁ·Î¼¼½º¸¦ ÀÌ·ç´Â ±âº»´ÜÀ§°¡ ¾²·¹µå¶ó º¼ ¼ö ÀÖ´Ù. ÇÁ·Î¼¼½º´Â Àû°Ô´Â ¼ö½Ê°³, ¸¹°Ô´Â ¼ö¹é°³ÀÇ Thread·Î ÀÌ·ç¾îÁ® ÀÖ´Ù. Áï ÀÌ·± ¾²·¹µåµéÀÌ ½Çó·³ ÀÏ·üÀûÀÎ ¼ø¼­´ë·Î ´Ã¾îÁ® ¿øÇÏ´Â ÀÛ¾÷À» ¼öÇàÇÏ°í ÀÖ´Â °ÍÀÌÁÒ. ½±°Ô º¸¸é ¾²·¹µå Çϳª°¡ ƯÁ¤ÇÑ ÀÛ¾÷À» Çϳª ¼öÇàÇÑ´Ù°í »ý°¢ ÇÒ ¼ö ÀÖ´Ù.

 

ÇÁ·Î±×·¥À» Â¥´Ùº¸¸é ¿©·¯°¡Áö »óȲÀÌ ¹ß»ýÇϴµ¥, ºí·ÏÅ·¸ðµå, ³íºí·ÏÅ· ¸ðµå, µ¿±â¸ðµå, ºñµ¿±â¸ðµå µîµî..

¿¹¸¦ Çϳª µé¾î º¸¸é,

while( true )

{

     int count;

     printf(  “Current number %d”, count );

     count++;

}

À§ÀÇ ·çƾ¿¡ µé¾î°¡°Ô µÇ¸é ÇÁ·Î±×·¥Àº ºí·Ï(¹«ÇÑ Loop¿¡ ºüÁü)µË´Ï´Ù. »ç¿ëÀÚ´Â ¾î¶² ÀԷµµ ÇÁ·Î±×·¥¿¡ °¡ ÇÒ ¼ö ¾ø½À´Ï´Ù. ±×·¡¼­ »ç¶÷µéÀº Àú·± ¹Ýº¹ÀûÀ¸·Î ÀÛ¾÷ÇÏ´Â °è»ê ·çƾ µîÀ» ¾²·¹µå·Î ¸¸µé¾î ¹ö¸°´Ù. Áï °è»ê°úÁ¤À» ¾²·¹µå·Î ¸¸µé¾î¼­ ÇϳªÀÇ ÀÛÀº ÀÛ¾÷À¸·Î ó¸®ÇØ ¹ö¸®´Â °ÍÀÌ´Ù. ±×·¯¹Ç·Î Àú·¸°Ô ¹Ýº¹ÀûÀÎ ÀÛ¾÷À̳ª ½Ã°£ÀÌ ¿À·¡ °É¸®´Â ÀÛ¾÷, ¶Ç´Â ´Ù¸¥ ÀÛ¾÷°ú º´ÇàÇؼ­ ÀÏÀ» ÇØ¾ß ÇÏ´Â °æ¿ì´Â ¾²·¹µå¸¦ »ç¿ëÇÏ°Ô µÈ´Ù.

 

¹°·Ð ó¸® ¼Óµµ ¹®Á¦´Â Á¶±Ý ´Ù¸¥ ¹®Á¦ÀÌ´Ù. ´ÜÁö ¾²·¹µå·Î ÇÁ·Î±×·¥À» ÀÛ¼ºÇϸé, OSÂ÷¿ø¿¡¼­ ¾²·¹µå°¡ CPU¸¦ »ç¿ëÇÒ ½Ã°£À» ºÐ¹è(Schedule)ÇÏ´Â °Í»ÓÀÌ´Ù. ´ÜÁö ÀÌ ½Ã°£ÀÇ °£°ÝÀÌ ¹«Áö ª±â ¶§¹®¿¡ »ç¿ëÀÚ´Â ´À³¢Áö ¸øÇÏ°í, ¸¶Ä¡ ¼ø°£ÀûÀ¸·Î µ¿½Ã¿¡ ÀÛµ¿ÇÏ´Â °Íó·³ º¸ÀδÙ.

 

¾²·¹µå´Â »ç¿ëÀÚ¿¡°Ô À¶Å뼺 ÀÖ´Â »ç¿ëȯ°æÀ» ¸¸µé¾î ÁÖ±â À§Çؼ­ °³¹ßÀÚ°¡ ÃæºÐÈ÷ °ËÅäÇÏ°í °³¹ß¿¡ Àû¿ëÇؾßÇÒ Å×Å©´ÐÀÌ´Ù.

 

2. ¾²·¹µåÀÇ ÀåÁ¡

A. ¾ÖÇø®ÄÉÀ̼ÇÀÇ ÀϺΰ¡ ºñµ¿±âÀûÀÌ°í º´·ÄÀûÀ¸·Î ½ÇÇà°¡´ÉÇÏ°Ô ÇÔ

B. ÄÚµåÀÇ º¹»çº»À» ¿©·¯ °³ ¼öÇàÇÏ¿© ¿©·¯ °³ÀÇ Å¬¶óÀ̾ðÆ®¿¡°Ô µ¿ÀÏÇÑ ¼­ºñ½º Á¦°ø°¡´É

C. ºí·Ï(Á×¾î¹ö¸± ¼ö ÀÖ´Â)µÉ °¡´É¼ºÀÌ ÀÖ´Â ÀÛ¾÷À» ¼öÇàÇÒ ¶§ ¹æÁöÇÒ ¼ö ÀÖÀ½

D. ¸ÖƼÇÁ·Î¼¼¼­ ½Ã½ºÅÛÀ» È¿°úÀûÀ¸·Î »ç¿ë ÇÒ ¼ö ÀÖÀ½

 

A. ¾ÖÇø®ÄÉÀ̼ÇÀÇ ÀϺΰ¡ ºñµ¿±âÀûÀÌ°í º´·ÄÀûÀ¸·Î ½ÇÇà°¡´ÉÇÏ°Ô ÇÔ

µ¿±âÀûÀ̶õ ¾î¶² ÀÛ¾÷ÀÌ ¼øÂ÷ÀûÀ¸·Î ½ÇÇàµÇ¾î¾ß ÇÔÀ» ¸»ÇÑ´Ù. ¿¹¸¦ µé¾î ¾î¶² ÇÔ¼ö µÎ°³°¡ ÀÖ´Ù°í °¡ÀåÇÏÀÚ.

 

int a = 2, b = 3, c;

int d = 4, e = 5, f;

funcA { c = a+b;}

funcB { f = d+e;}

´ÜÀÏ ¾²·¹µå ȯ°æ¿¡¼­´Â ÇÔ¼öA¸¦ È£ÃâÇÑ ´ÙÀ½¿¡ ÇÔ¼öB¸¦ È£ÃâÇÑ´Ù.

funcA()

funcB()

±×·±µ¥ ÇÔ¼öA¿Í ÇÔ¼öB°¡ ¼­·Î ¿ÏÀüÈ÷ ´Ù¸¥ µ¥ÀÌÅ͸¦ °¡Áö°í ÀÛ¾÷À» ÇÑ´Ù¸é, ÇÔ¼ö°¡ ½ÇÇàµÇ´Â ¼ø¼­¿¡´Â »ó°üÀÌ ¾ø´Ù. Áï ÇÔ¼öÀÇ È£Ãâ ¼ø¼­°¡ ¹Ù²î¾îµµ »ó°üÀÌ ¾ø´Ù.

funcB()

funcA()

 

±×·¯³ª »õ·Î¿î ÇÔ¼ö C¸¦ ¸¸µé¾î º¸ÀÚ.

in funcC { return c + f;}

À§ÀÇ ÇÔ¼ö´Â ÇÔ¼öA¿Í ÇÔ¼öBÀÇ °á°ú°ªÀ» °¡Áö°í ¿¬»êÀ» Çϱ⠶§¹®¿¡, ÇÔ¼öA¿Í ÇÔ¼öB°¡ ¿ÏÀüÈ÷ ½ÇÇàÀÌ ³¡³­ ´ÙÀ½¿¡¾ß È£ÃâÇÒ ¼ö°¡ ÀÖ´Ù. À§¿Í °°ÀÌ ¼øÂ÷ÀûÀ¸·Î ½ÇÇàÀ» Çؾ߸¸ ÇÏ´Â ¼øÂ÷ÀûÀÎ ÇÁ·Î±×·¥ ¹æ½ÄÀ» µ¿±âÈ­(Synchronization)¶ó°í ÇÕ´Ï´Ù. ºñµ¿±âÈ­´Â À§¿Í °°ÀÌ ¼øÂ÷ÀûÀ¸·Î ½ÇÇàÀ» ¾È Çصµ µÇ´Â °ÍÀÌ´Ù.

 

´ÜÀÏ ¾²·¹µå¸¦ Áö¿øÇÏ´Â OS¿¡¼­´Â ¹Ýµå½Ã À§¿Í °°Àº ÀýÂ÷¸¦ °¡Áö°í ÇÁ·Î±×·¡¹ÖÀ» ÇØ¾ß ÇÏÁö¸¸ ¸ÖƼ ¾²·¹µå¸¦ »ç¿ëÇÏ´Â OS¿¡¼­´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¶§ °¢ ºÎºÐ »çÀÌ¿¡ »óÈ£°ü°è¸¦ ¹Ý¿µÇÏ¿© ¼³°è¸¦ ÇÒ ¼ö ÀÖµµ·Ï ÇÏ´Â °ÍÀÌ´Ù.

 

B. ÄÚµåÀÇ º¹»çº»À» ¿©·¯ °³ ¼öÇàÇÏ¿© ¿©·¯ °³ÀÇ Å¬¶óÀ̾ðÆ®¿¡°Ô µ¿ÀÏÇÑ ¼­ºñ½º Á¦°ø°¡´É

Network ÇÁ·Î±×·¥ °°Àº °æ¿ì »ç¿ëÀÚÀÇ Á¢¼ÓÀ» °è¼Ó ó¸®Çϱâ À§Çؼ­ ¾²·¹µå¸¦ »ç¿ëÇÕ´Ï´Ù. Áï »ç¿ëÀÚ°¡ Á¢¼Ó ¿äûÀ» Çϸé ÇϳªÀÇ ¾²·¹µå¿Í ¿¬°á½ÃÄÑÁØ´Ù. ¿©·¯ »ç¿ëÀÚ°¡ ´ÜÀÏ ¾²·¹µåÀÇ ¼­¹ö ÇÁ·Î±×·¥¿¡ Á¢¼ÓÇؼ­ ¼­ºñ½º¸¦ ¹Þ´Â´Ù°í °¡Á¤Çϸé, ÇÑ ¸íÀÌ Á¢¼ÓÇؼ­ ±× »ç¶÷ÀÌ Á¢¼ÓÀ» ²÷À» ¶§±îÁö ´Ù¸¥ »ç¿ëÀÚ´Â ¼­ºñ½º¸¦ ¹ÞÀ» ¼ö ¾ø´Ù.

 

C. ºí·Ï(Á×¾î¹ö¸± ¼ö ÀÖ´Â)µÉ °¡´É¼ºÀÌ ÀÖ´Â ÀÛ¾÷À» ¼öÇàÇÒ ¶§ ¹æÁöÇÒ ¼ö ÀÖÀ½

Network ÇÁ·Î±×·¡¹Ö¿¡¼­ ºí·Ï µÇ´Â Äڵ尡 ÀÖ´Ù°í °¡Á¤ÇÏÀÚ. ´ëÇ¥ÀûÀ¸·Î º¸¸é accept()°¡ Àִµ¥, ÀÌ ÇÔ¼ö´Â »ç¿ëÀÚ°¡ Á¢¼Ó¿äûÀ» ÇÒ ¶§±îÁö ¸ØÃç Àִ´Ù. »ç¿ëÀÚ Á¢¼Ó¿äûÀÌ ¾øÀ¸¸é ¹«ÇÑÁ¤ ±â´Ù¸®°Ô µÈ´Ù. ±×·¡¼­ Á¢¼Ó¿äûÀ» ¹Þ´Â ºÎºÐÀ» ¾²·¹µå·Î ¸¸µé¾î¼­ ÇÁ·Î±×·¥ÀÌ ºí·ÏµÇÁö ¾Ê°Ô ÇÏ´Â °ÍÀÌ´Ù.

¶Ç ´Ù¸¥ ¿¹·Î, Ž»ö±â¿¡¼­ µ¢Ä¡°¡ Å« ÆÄÀÏÀ» º¹»ç¸¦ °É¾î³õ°íµµ °ð¹Ù·Î Ž»ö±â¸¦ ´Ù½Ã Àִµ¥, ÀÌ´Â º¹»çÇÏ´Â ·çƾÀ» ¾²·¹µå·Î ¸¸µé¾ú±â ¶§¹®ÀÌ´Ù.

 

D. ¸ÖƼ ÇÁ·Î¼¼¼­ ½Ã½ºÅÛÀ» È¿°úÀûÀ¸·Î »ç¿ë ÇÒ ¼ö ÀÖÀ½

CPU°¡ ¸¹Àº ½Ã½ºÅÛ¿¡¼­ ¾²·¹µå¸¦ µ¹¸®¸é Á»´õ È¿À²ÀûÀÌ´Ù.

 

3. ¸ÖƼ¾²·¹µå ¾ÖÇø®ÄÉÀÌ¼Ç ±¸Á¶

¸ÖƼ¾²·¹µå¸¦ ÀÌ¿ëÇÑ ¾ÖÇø®ÄÉÀ̼ÇÀ» ÀÛ¼ºÇÏ´Â ±¸Á¶¿¡´Â 3°¡Áö ¹æ¹ýÀÌ ÀÖ´Ù.

A. boss/worker¸ðµ¨.

B. work crew¸ðµ¨.

C. ÆÄÀÌÇÁ¶óÀÌ´× ¸ðµ¨.

 

A. Boss/Worker Model

¾²·¹µå(ÁÖ¾²·¹µå)°¡ ÇÊ¿ä¿¡ µû¶ó ÀÛ¾÷ÀÚ ¾²·¹µå¸¦ ¸¸µé¾î ³»´Â °æ¿ì¿¡, À§¿¡¼­ ¿¹¸¦ µç °Í°ú °°ÀÌ Á¢¼Ó¹Þ´Â ºÎºÐÀ» ÁÖ¾²·¹µå(boss)·Î µ¹¸®°í, Á¢¼Ó¿äûÀÌ ¿À¸é »õ·Î¿î ¾²·¹µå(worker)¸¦ ¸¸µé¾î »ç¿ëÀÚ¿Í ¿¬°á½ÃÄÑ ÁÖ´Â ¹æ¹ýÀÔ´Ï´Ù.

 

B. Work Crew Model

¾î¶² ÇÑ ÀÛ¾÷À» ¿©·¯ °³ÀÇ ¾²·¹µå°¡ ³ª´²¼­ ÇÏ´Â ¹æ½ÄÀÌ´Ù. ¿¹¸¦ µé¾î, ÁýÀ» û¼ÒÇÏ´Â ÀÛ¾÷¿¡ ´ëÇÑ ¾²·¹µå¸¦ ¿©·¯ °³ µ¹·Á, ¹æ¹Ù´Ú ´Û´Â »ç¶÷, ¸ÕÁö ÅÍ´Â »ç¶÷ ÀÌ·± ½ÄÀÌ´Ù. ƯÁ¤ÇÑ Ã»¼Ò¸¦ ÇÏ´Â ÀÛ¾÷ÀÌ ¾²·¹µå Çϳª°¡ µÇ´Â °ÍÀÌ´Ù.

 

C. Pipe Lining Model

ÀÌ ±¸Á¶¿¡¼­´Â ¼ø¼­´ë·Î ½ÇÇàµÇ¾î¾ßÇÒ ÀÛ¾÷ÀÌ ¿©·¯ °³°¡ ÀÖÀ» °æ¿ì, ÀÛ¾÷ 1Àº ÀÛ¾÷ 2¿¡°Ô Àü´ÞÇÏ°í, ÀÛ¾÷2´Â ÀÛ¾÷3¿¡°Ô Àü´ÞÇÏ´Â ¹æ½ÄÀ¸·Î ¼øÂ÷ÀûÀ¸·Î ÁøÇàµÇ¾î¾ß ÇÏÁö¸¸ ÃÖÁ¾°á°ú¸¦ ¿©·¯ °³ ¸¸µé¾î³»±â À§Çؼ­ µ¿½Ã¿¡ ¼öÇàµÉ ÇÊ¿ä°¡ ÀÖÀ» °æ¿ì ¸ÖƼ¾²·¹µùÀ» »ç¿ëÇÑ´Ù. ¿¹¸¦ µé¸é °øÀåÀÇ ¶óÀο¡¼­´Â ¼­·Î ´Ù¸¥ ÀÛ¾÷µéÀ» ¼öÇàÇÏÁö¸¸, °á±¹ ÇϳªÀÇ °á°ú¹°À» ¸¸µé¾î ³»±â À§ÇÑ °úÁ¤ÀÌ´Ù.

 

4. ¾²·¹µåÀÇ »ý¼º

¾²·¹µå´Â UI( User Interface ) Thread¿Í Worker( ÀÛ¾÷ÀÚ ) ¾²·¹µå·Î ³ª´¶´Ù.

UI Thread´Â »ç¿ëÀÚ ¸Þ½ÃÁö ·çÇÁ¸¦ °¡Áö°í ÀÖ´Â(Áï ¾î¶² ¸Þ½ÃÁö°¡ ³¯¶ó¿À¸é ÀÏÇÏ´Â ¾²·¹µå¸¦ ¸»ÇÑ´Ù.) ¾²·¹µåÀÌ´Ù.

Worker ¾²·¹µå´Â º¸Åë ¿À·¡ °É¸®´Â ÀÛ¾÷À̳ª ¹«ÇÑ·çÇÁ¸¦ °¡Áö´Â ÀÛ¾÷À» ÇÏ´Â »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö¸¦ À§ÇÑ °ÍÀÌ´Ù.

 

À©µµ¿ì¿¡¼­ ¾²·¹µå¸¦ »ý¼ºÇÏ´Â ¹æ¹ýÀº ¿©·¯°¡Áö°¡ ÀÖ´Ù. Áï À©µµ¿ì¶ó´Â OS¿¡¼­ Á¦°øÇØÁÖ´Â ¶óÀ̺귯¸®ÇÔ¼ö¸¦ °¡Áö°í ¾²·¹µå¸¦ ¸¸µå´Â °ÍÀÔ´Ï´Ù.

 

Wokrer ½º·¹µå¸¦ ¸¸µå´Â ¹æ¹ýÀ» ¾Ë¾Æº¸ÀÚ.

¾î¶² ÇÁ·Î±×·¥ÀÌ Dialog ±â¹ÝÀ¸·Î µ¹¾Æ°¡¸ç, È­¸é¿¡ 2ÃÊ¿¡ Çѹø¾¿ ¼ýÀÚ¸¦ ´õÇϸé È­¸é¿¡ ¹Ù²ï ¼ýÀÚ¸¦ Ç¥½ÃÇÑ´Ù°í °¡Á¤ÇÑ´Ù.

 

¨ç È­¸é¿¡ ¹«ÇÑÀûÀ¸·Î ¼ýÀÚ¸¦ »Ñ¸®´Â ÇÔ¼ö¸¦ ¸¸µê

UINT ThreadFunc( void* pParam )

{

   int count;

   while(true)

{

   count++;

   GetDlgItem( IDC_STATIC )‐>SetWindowText( atoi(count) );

   Sleep( 2000 );

}

}

//Á¤È®ÇÑ ÄÚµå´Â ¾Æ´Ô

// IDC_STATIC´Â static_control ÀÇ resource id ÀÓ

 

ÀÌ ÇÔ¼ö´Â 2ÃÊ¿¡ Çѹø¾¿ count¸¦ Áõ°¡½ÃÅ°¸é¼­ Dialog box¿¡ Áõ°¡µÈ °ªÀ» È­¸é¿¡ »Ñ¸°´Ù. ÀÌ ÇÔ¼ö´Â ¾²·¹µå·Î µ¹¸®·Á ÇÑ´Ù.

 

¨è Worker ¾²·¹µå »ý¼ºÇϱâ

ÀÛ¾÷ÀÚ ¾²·¹µå·Î ƯÁ¤ÇÑ ÀÛ¾÷À» ÇÏ´Â »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö¸¦ ¸¸µé±â À§Çؼ­, À©µµ¿ì¿¡¼­´Â ¿©·¯°¡Áö ¾²·¹µå »ý¼º ÇÔ¼ö¸¦ Á¦°øÇØ ÁØ´Ù.

1.  CreateThread()

2.  _beginthread(), _beginthreadex()

3.  AfxBeginThread(), AfxBeginThreadEx()

 

1. CreateThread()

win32ÇÔ¼ö·Î½á, Áß¿äÇÑ parameter¸¸ »ìÆ캻´Ù.

     HANDLE handle;

     Handle = CreateThread( Threadfunc(), Param );

ù¹ø° parameter´Â À§¿¡¼­¿Í °°ÀÌ »ç¿ëÀÚ°¡ ¾²·¹µå·Î µ¹·Á¾ßÇÒ ÀÛ¾÷ÇÔ¼ö¸¦ ½á ÁÖ¸ç, µÎ ¹ø° parameter´Â ÀÛ¾÷ÇÔ¼ö¿¡ parameter°ªÀ¸·Î Àü´ÞÇÒ °ªÀÌ´Ù. ÀÌ parameter´Â VOID*À¸·Î µÇ¾î Àֱ⠶§¹®¿¡ 4BYTEÀ̳»ÀÇ °ªÀº ¾î¶² °ªÀÌµç µé¾î°¥¼ö ÀÖ´Ù. ´ë½Å TYPE CASTINGÀ» ÇØÁÖ¾î¾ß ÇÕ´Ï´Ù.(ex. (int) 3). ÀÌ ÇÔ¼ö°¡ ¿Ã¹Ù¸£°Ô ½ÇÇàÀÌ µÇ¸é ¾²·¹µå¿¡ ´ëÇÑ ÇÚµéÀ» ¹ÝȯÇϴµ¥, ÀÌ ÇÚµéÀ» °¡Áö°í ¾²·¹µå¸¦ Á¶ÀÛÇÒ ¼ö ÀÖ°Ô µÈ´Ù.

´ëÇ¥ÀûÀ¸·Î ¾²·¹µå¸¦ ´ÝÀ» ¶§ CloseHandle()ÇÔ¼ö¸¦ »ç¿ëÇؼ­ ¾²·¹µå ÇÚµéÀ» ³Ö¾îÁÖ°í ¾²·¹µå¸¦ ´Ý¾Æ ÁØ´Ù. ±×·¯³ª ÀÌ ÇÔ¼ö·Î »ý¼ºµÈ ¾²·¹µå¸¦ ´ÝÀ»¶§´Â ExitThread()¸é µÈ´Ù.

 

2. _beginthread(), _beginthreadex()

CreateThread´Â ¾²·¹µå¿¡¼­ win32 APIÇÔ¼ö¸¸ È£ÃâÇÒ ¼ö ÀÖ´Ù. Áï, »ç¿ëÀÚ°¡ ¾î¶² ÀÛ¾÷À» ÇÏ´Â ÇÔ¼ö¸¦ ¸¸µé ¶§ CreateThread·Î ¸¸µé°Ô µÇ¸é, ±× ÇÔ¼ö¾È¿¡¼­´Â win32 API¸¸ »ç¿ëÇÒ ¼ö ÀÖ°í, CÇÔ¼ö³ª MFC´Â ¸ø¾´´Ù.

±×·¯³ª _beginthread() ÇÔ¼ö´Â win32 API¿Í  C ·±Å¸ÀÓ ÇÔ¼ö¸¦ »ç¿ëÇÒ ¶§ »ç¿ëÇÑ´Ù.

ÁÖÀÇÇÒ Á¡Àº ÀÌ ÇÔ¼öµµ ¾²·¹µå ÇÚµéÀ» ¸®ÅÏÇϴµ¥, ÀÌ ÇÚµéÀ» °¡Áö°í ¾²·¹µå¿¡ Á¶ÀÛÀ» °¡ ÇÒ ¼ö ÀÖ´Ù. ´ë½Å ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇϸé C ·±Å¸ÀÓ ¶óÀ̺귯¸®°¡ ÇÚµéÀ» ÀÚµ¿À¸·Î ´ÝÀ¸¹Ç·Î À̸¦ Á÷Á¢ ´ÝÀ» ÇÊ¿ä´Â ¾ø´Ù. ÇÏÁö¸¸, _beginthreadex´Â ½º·¹µå ÇÚµéÀ» Á÷Á¢ ´Ý¾Æ¾ß ÇÕ´Ï´Ù. ±×¸®°í ÀÌ ¾²·¹µå¸¦ ´ÝÀ» ¶§´Â _endthread(), _endthreadex()¸¦ »ç¿ëÇÏ¸é µÈ´Ù.

 

3. AfxBeginThread(), AfxBeginThreadEx()

½ÇÁúÀûÀ¸·Î °¡Àå ÀÚÁÖ »ç¿ëÇÏ´Â ¾²·¹µå »ý¼ºÇÔ¼ö ÀÌ´Ù. ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¸é »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö³»¿¡¼­ MFC, win32 API, C ·±Å¸ÀÓ ¶óÀ̺귯¸®µî ¿©·¯°¡Áö ¶óÀ̺귯¸® ÇÔ¼öµéÀ» ÀüºÎ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ ÇÔ¼ö´Â ¸®ÅÏ°ªÀÌ CwinThread* ÇüÀ» ¸®ÅÏÇϴµ¥, ÀÌ °´Ã¼¸¦ »ç¿ëÇϸé, »ý¼ºµÈ ¾²·¹µå¿¡ ¿©·¯°¡Áö Á¶ÀÛÀ» °¡ÇÒ ¼ö ÀÖ´Ù. AfxEndThread()¸¦ »ç¿ëÇؼ­ Á¾·á ½Ãų ¼ö ÀÖ´Ù. ¾²·¹µå°¡ Á¾·áµÇ¸é MFC´Â ¾²·¹µå ÇÚµéÀ» ´Ý°í ¸®ÅÏ°ªÀ¸·Î ¹ÞÀº CwinThread*°´Ã¼¸¦ Á¦°ÅÇÕ´Ï´Ù.

 

5. MFC¿¡¼­ ÀÛ¾÷ÀÚ ¾²·¹µå »ý¼ºÇϱâ..

MFC¿¡¼­ ¾²·¹µå¸¦ ¸¸µå´Â ¹æ¹ýÀº µÎ °¡Áö°¡ ÀÖ´Ù. CwinThreadÀÇ ¸â¹ö ÇÔ¼öÀÎ CreateThread¸¦ »ç¿ëÇÏ´Â ¹æ¹ý°ú AfxBeginThread()¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀÌ´Ù. ÈÄÀÚ´Â CwinThread°´Ã¼¸¦ ¸¸µé ¼ö ÀÖ´Ù.

 

¶ÇÇÑ MFC¿¡¼­´Â AfxBeginThreadÀÇ ¼­·Î ´Ù¸¥ ¹öÀü µÎ°³¸¦ Á¤ÀÇ ÇÏ°í ÀÖ´Ù. Çϳª´Â ÀÛ¾÷ÀÚ ¾²·¹µå¸¦ À§ÇÑ °ÍÀÌ°í, Çϳª´Â UI¾²·¹µå¸¦ À§ÇÑ °ÍÀε¥, ÀÌ µÎ °¡Áö Á¤ÀÇ´ëÇÑ ¼Ò½ºÄÚµå´Â Thrdcore.cpp¿¡¼­ º¼ ¼ö ÀÖ´Ù.

 

CwinThread* pThread = AfxBeginThread( Threadfunc, &threadinfo );

 

▪ nProiority´Â ¾²·¹µåÀÇ ¿ì¼±¼øÀ§¸¦ ÁöÁ¤ÇÑ´Ù. ±âº»ÀûÀ¸·Î THREAD_PRIORITY_NORMALÀÌ µé¾î°¡´Âµ¥ ÀÌ´Â Æò¹üÇÑ ¼ø¼­·Î ÀÛµ¿½ÃÅ°°Ú´Ù´Â ¸»ÀÌ´Ù. ÀÌ ¿ì¼±¼øÀ§´Â ³ªÁß¿¡ ¸®ÅÏ°ªÀ¸·Î ¹ÞÀº CwinThread* ÀÇ ¸â¹ö ÇÔ¼öÀÎ SetThreadPriority¸¦ °¡Áö°í º¯°æÇØ ÁÙ ¼ö ÀÖ´Ù.

▪ dwCreateFlags´Â 0 ¾Æ´Ï¸é CREATE_SUSPENDÀÌ´Ù. ±âº»°ªÀº 0ÀÌ µé¾î°¡´Âµ¥ 0ÀÌ¸é ¹Ù·Î ¾²·¹µå°¡ ½ÇÇàµÇ´Â °ÍÀÌ°í µÎ ¹ø°ÀÌ¸é ¾²·¹µå´Â Á¤ÁöµÈ »óÅ·Π¸¸µé¾îÁö°í ¸®ÅÏ°ªÀ¸·Î ¹ÞÀº °´Ã¼ÀÇ ¸â¹öÇÔ¼öÀÎ ResumeThread¸¦ È£ÃâÇÏ¸é ¾²·¹µå¸¦ ½ÃÀÛÇÑ´Ù.

▪  lpSecurityAttrs´Â º¸¾È¼Ó¼ºÀÌ´Ù.

 

AfxBeginThread() ÇÔ¼öÀÇ Ã¹¹ø° ÀÎÀÚ·Î µé¾î°¥ ÀÛ¾÷ÇÔ¼öÀÇ ¿øÇüÀº ´ÙÀ½°ú °°´Ù.

     

     UINT ThreadFunc ( LPVOID pParam )

 

ÀÌ ÇÔ¼ö´Â static Ŭ·¡½º ¸â¹ö ÇÔ¼ö À̰ųª Ŭ·¡½º ¿ÜºÎ¿¡¼­ ¼±¾ðÇÑ ÇÔ¼ö¿©¾ß ÇÑ´Ù.

Áï, ¾î¶² ÇÔ¼ö¸¦ Ŭ·¡½º ¸â¹öÇÔ¼ö·Î ¼±¾ðÇؼ­ ¾²·¹µå·Î »ç¿ëÇÏ·Á¸é Ŭ·¡½º³»ºÎ¿¡ ÇÔ¼ö ÇÁ·ÎÅäŸÀÔ ¼±¾ð½Ã static·Î ¼±¾ðÇØ ÁÖ¾î¾ß ÇÑ´Ù´Â °Çµ¥, static ¸â¹ö ÇÔ¼ö´Â static ¸â¹ö º¯¼ö¿¡¸¸ Á¢±Ù ÇÒ ¼ö Àֱ⠶§¹®¿¡ Á¦¾àÀÌ ¸¹´Ù.

 

ÀÎÀÚ°ªÀº AfxBeginThread¿¡¼­ µÎ¹ø° ÀÎÀÚ·Î µé¾î°¬´ø 32bit°ªÀÇ ÆĶó¹ÌÅÍ Àε¥, ÀϹÝÀûÀ¸·Î ±×³É µ¥ÀÌÅÍÇüÀ» ³Ñ°ÜÁÙ ¼öµµ ÀÖ°í, ¸¹Àº µ¥ÀÌÅÍ°¡ ÀÖÀ» ¶§¿¡´Â ±¸Á¶Ã¼¸¦ ¸¸µé¾î¼­ Æ÷ÀÎÅÍ·Î ³Ñ°ÜÁ־ ÇÔ¼ö³»ºÎ¿¡¼­ ´Ù½Ã Ç®¾î¼­ »ç¿ëÇÑ´Ù.

 

¾²·¹µå ÇÔ¼ö ³»ºÎ¿¡¼­ ¸¸µé¾îÁø °´Ã¼³ª º¯¼öµéÀº ¾²·¹µå ÀÚ½ÅÀÇ ³»ºÎ ½ºÅÿ¡ »ý¼ºµÇ±â ¶§¹®¿¡ ´Ù¸¥ ¾²·¹µå¿¡¼­ µ¥ÀÌÅ͸¦ º¯°æÇϰųª ÇÏ´Â ±×·± ¹®Á¦µéÀº ¾ø´Ù.

 

6. ¾²·¹µå ¸ØÃß°í ´Ù½Ã ½ÇÇàÇϱâ

AfxBeginThread() ÇÔ¼ö·Î ÀÛ¾÷À» ÇÒ ÇÔ¼ö¸¦ ½º·¹µå·Î µ¹¸®°í ±× ½º·¹µå°¡ ¿Ã¹Ù¸£°Ô ÀÛµ¿ÀÌ µÇ¸é CwinThread*ÇüÀ» ¸®ÅÏ°ªÀ¸·Î ¹Þ´Â´Ù´Â °ÍÀ» ¾Ë°Ô µÇ¾ú´Ù. ÀÌ·¸°Ô µÇ¸é ¿ì¸®´Â ÀÌ ½ÇÇà½ÃŲ ½º·¹µå¸¦ »ç¿ëÀÚ°¡ ¸ØÃß°í ½ÍÀ» ¶§ ¸ØÃß°Ô ÇÒ ¼ö ÀÖ°í, ¶Ç ¸ØÃèÀ¸¸é ¾ðÁ¨°¡ ´Ù½Ã ½ÇÇàÀ» ½ÃÄÑ¾ß ÇÑ´Ù.

¿ì¼± ½ÇÇàÁßÀÎ ½º·¹µåÇÔ¼ö¸¦ ¸ØÃß°Ô ÇÒ¶§´Â ¿ì¸®°¡ ¸®ÅÏ°ªÀ¸·Î µ¹·Á¹ÞÀº CwinThread*ÀÇ º¯¼ö¸¦ °¡Áö°í ÀÛ¾÷À» ÇÒ ¼ö ÀÖ´Ù.

     CwinThread::SuspendThread()

À§ÀÇ ÇÔ¼ö°¡ ¹Ù·Î ½ÇÇàÁßÀÎ ½º·¹µå¸¦ ¸ØÃâ ¼ö ÀÖ°Ô ÇÏ´Â ÇÔ¼öÀÌ´Ù. ÀÌ ÇÔ¼ö´Â ÇöÀç ½ÇÇàÁßÀÎ ½º·¹µå ³»ºÎ¿¡¼­ È£ÃâÇÒ ¼öµµ ÀÖ°í, ¶ÇÇÑ ´Ù¸¥ ¾²·¹µå ³»¿¡¼­µµ È£ÃâÇÒ ¼ö°¡ ÀÖ´Ù.

     CwinThread::ResumeThread()

À§ ÇÔ¼ö´Â ÁßÁöµÈ ¾²·¹µå¸¦ ±ú¿ì´Â ÇÔ¼öÀÌ´Ù. ÀÌ ÇÔ¼ö´Â À§ÀÇ SuspendThread°°ÀÌ ½º·¹µå ÀÚ±âÀÚ½ÅÀÇ ³»ºÎ¿¡¼­´Â È£ÃâÇÒ ¼ö°¡ ¾ø´Ù. ´Ù¸¥ ¾²·¹µå³ª ¸Þ½ÃÁö Handler ÇÔ¼öµéÀ» ÀÌ¿ëÇؼ­ ResumeThread()¸¦ È£ÃâÇؾßÁö ¸ØÃçÁø ¾²·¹µå¸¦ ´Ù½Ã ½ÇÇà ÇÒ ¼ö ÀÖ´Ù.

 

(Âü°í) ½º·¹µå ³»ºÎ·Î º¹ÀâÇÏ°Ô µé¾î°¡¸é ³»ºÎÀûÀ¸·Î °¢ ½º·¹µå ÇÔ¼ö´Â Suspend count¶õ °ÍÀ» À¯ÁöÇÏ°í À־ ÀÌ °ªÀÌ 0ÀÏ ¶§¸¸ ½º·¹µå°¡ CPU½Ã°£À» ÇÒ´ç¹Þ¾Æ ½ÇÇàÀÌ µÈ´Ù. Áï AfxBeginThreadÇÔ¼ö¿¡ dwCreateFlags¿¡ CREATE_SUSPEND¸¦ ³Ö¾îÁ༭ ½ÇÇàÇѴٰųª CwinThread::SuspendThread()¸¦ ½ÇÇàÇϰųª Çϸé Suspend count´Â 1ÀÌ Áõ°¡°¡ µÈ´Ù. ±×·¡¼­ ½º·¹µå´Â ¸ØÃß°Ô µÇ°í ´Ù½Ã CPU·ÎºÎÅÍ ½Ã°£À» ÇÒ´ç¹Þ¾Æ ½º·¹µå°¡ È°µ¿À» Àç°³ÇÏ°Ô ÇÏ·Á¸é ResumeThred()¸¦ È£ÃâÇؼ­ suspend count¸¦ 0À¸·Î ¸¸µé¾î ÁÖ¾î CPU½Ã°£À» ÇÒ´ç¹Þ°Ô Çؼ­ ½º·¹µå¸¦ ´Ù½Ã ½ÃÀÛÇÑ´Ù. ³»ºÎÀûÀ¸·Î ÀÌ·± ¸ÞÄ¿´ÏÁòÀ» °¡Áö°í ½º·¹µå´Â µ¿ÀÛÇϱ⠶§¹®¿¡ SuspendThread()¸¦ µÎ ¹ø È£ÃâÇϸé suspend count°¡ 2°¡ µÇ°í, RecumeThread()µµ µÎ ¹ø È£ÃâÇØ Áà¾ß ½º·¹µå°¡ ´Ù½Ã È°µ¿ÇÒ ¼ö°¡ ÀÖ´Ù.

 

 

7. ½º·¹µå ÀáÀç¿ì±â

¾²·¹µå¸¦ ÀáÀç¿ì´Â ÀÌÀ¯´Â Å©°Ô µÎ °¡Áö°¡ ÀÖ´Ù.

Çϳª´Â ¿¡´Ï¸ÞÀ̼ÇÀ» ±¸ÇöÇϰųª ¾Æ³¯·Î±× ½Ã°èÀÇ ¹Ù´Ã °°ÀÌ ½Ã°£ÀÌ °æ°úÇÔ¿¡ µû¶ó È­¸é¿¡ ±×¸²À» ±×¸°´ÙµçÁö Çϴ  °æ¿ì, Áï ½Ã°£ °æ°ú¿¡ µû¶ó ½ÇÇàÇÏ¿©¾ß ÇÏ´Â ÇÁ·Î±×·¥ÀÇ °æ¿ìÀÌ°í,

µÎ ¹ø°´Â ¾î¶² ½º·¹µå°¡ ÇöÀç ½ÇÇàµÇ¾î¾ß ÇÏ´Â ½ÃÁ¡¿¡¼­ ´Ù¸¥ ¾²·¹µå¿¡°Ô ¾çº¸¸¦ ÇÒ °æ¿ì¿¡ »ç¿ëµÈ´Ù.

ù ¹ø°ÀÇ °æ¿ì´Â, ÇѸ¶µð·Î ¾²·¹µå ³»ºÎ¿¡¼­¸¸ »ç¿ëÇÏ´Â ¾²·¹µå ŸÀ̸Ӷó°í »ý°¢ÇÒ ¼ö ÀÖ´Ù. Áï ÀÏÁ¤½Ã°£ÀÌ Áö³ª¸é ¹Ýº¹ÀûÀ¸·Î ÀÛ¾÷À» ÇÒ ¶§ À¯¿ëÇÏ´Ù.

 

¾²·¹µå ³»ºÎ¿¡¼­µµ Sleep()¶ó´Â °É ÀÌ¿ëÇÏ¸é ¾²·¹µå ³»ºÎ ·çƾÀ» ŸÀ̸Ӹ¦ »ç¿ëÇßÀ» ¶§¿Í ºñ½ÁÇÏ°Ô ¸¸µé ¼ö ÀÖ´Ù.

¾²·¹µå¸¦ ÀáÀç¿ï ¶§´Â ´ÙÀ½ÀÇ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.

     ::Sleep( 0 );

À§ ÇÔ¼ö´Â win32 APIÇÔ¼öÀÌ´Ù. µû¶ó¼­ »ç¿ëÇÒ ¶§ :: ¸¦ ÀÌ¿ëÇؼ­ È£ÃâÇÑ´Ù. ¸¸¾à À§ÀÇ ÇÔ¼ö¸¦

     ::Sleep( 5000 );

Çϸé ÀÌ ¾²·¹µå´Â 5ÃÊ µ¿¾È CPU½Ã°£À» ¾²Áö ¾Ê°Ô µÇ¸ç, ÀÌ·¸°Ô Àáµé¾î ÀÖÀ» ¶§´Â ´Ù¸¥ ¾²·¹µå°¡ CPU½Ã°£À» ¾ò¾î¼­ È°µ¿ÇÏ°Ô µÈ´Ù.

 

µÎ¹ø°´Â À§ÀÇ Ã¹ ¹ø° ¿¹¿Í °°ÀÌ ÀÎÀÚ·Î 0À» ÁÖ´Â °æ¿ìÀε¥, ÀÌ °æ¿ì¿¡ ÇöÀç ½º·¹µå¸¦ Á¤ÁöÇÏ°í(0 À̸é 0.001ÃÊÀÎ À̵¥..¸ØÃß´Ù´Ï..) ÀÌ ½º·¹µå°¡ CPU½Ã°£À» Ç®¾îÁÙ ¶§±îÁö ±â´Ù¸®´ø ´Ù¸¥ ½º·¹µå°¡ ½ÇÇàµÈ´Ù. ±×·±µ¥ ´Ù¸¥ ½º·¹µå´Â ÀÌ ½º·¹µå¿Í ¿ì¼±¼øÀ§°¡ °°¾Æ¾ß ÇÑ´Ù. ±×¸®°í °°Àº ¿ì¼±¼øÀ§ÀÇ ½º·¹µå°¡ ¾ø´Ù¸é ÇöÀç sleep(0)À» ½ÇÇàÇß´ø ½º·¹µå°¡ °è¼Ó ½ÇÇàÀÌ µÈ´Ù.

½º·¹µå ¾È¿¡¼­ sleep()¸¦ ¾²´Â °æ¿ì´Â ½Ã°£ÀÇ Áö¿¬À» µÎ°í ÀÛ¾÷À» ÇØ¾ß ÇÏ´Â °æ¿ì¿¡ ¸¹ÀÌ »ç¿ëµÈ´Ù. (ex. ¾Æ³¯·Î±× ½Ã°è)

 

CwinThread* pThread = AfxBeginThread( TimeFunc, pParam );

 

UINT TimeFunc( void* pParam )

{

     void* param = (void*) pParam;  // »ç¿ëÀÚ°¡ ³Ñ°ÜÁØ µ¥ÀÌÅ͸¦ »ç¿ëÇϱâ À§ÇÔ

     while( true )

     {

     ::Sleep( 1000 );          // ÀÌ°÷¿¡¼­ 1ÃÊ°¡ ¸ØÃçÁø´Ù.

     DrawTime();             // ÃÊħÀ» ±×¸®´Â ÇÔ¼ö     

     }

}

 

7. ½º·¹µå Á×À̱â

¾²·¹µå¸¦ Á×ÀÌ´Â ÀÌÀ¯´Â ÀÚ±âÀÇ ÀÏÀ» ´Ù ¸¶Ä¡°í ³ª¸é ´ç¿¬È÷ ¾²·¹µå´Â ¾ø¾îÁ®¾ß Çϱ⠶§¹®ÀÌ´Ù. ±×·¸Áö ¾ÊÀ¸¸é,  ¾²·¹µå´Â ¿©ÀüÈ÷ ÀڱⰡ µé¾î¾ÉÀº ¸Þ¸ð¸® ¼Ó¿¡ ¾É¾Æ¼­ ÄÄÇ»ÅÍ ¸®¼Ò½º¸¸ Àâ¾Æ¸Ô°í ÀÖ°Ô µÈ´Ù.

½º·¹µå¸¦ Á×ÀÌ´Â ¹æ¹ý¿£ µÎ °¡Áö°¡ ÀÖ´Ù.

     ¨ç ½º·¹µå ³»ºÎ¿¡¼­ returnÀ» ½Ãų ¶§.

     ¨è AfxEndThread¸¦ È£ÃâÇÒ ¶§.

 

¾ÈÀüÇÑ ¹æ¹ýÀº ½º·¹µå ³»ºÎ ÀÚü¿¡¼­ return¹®À» ÀÌ¿ëÇÏ´Â °ÍÀÌ ¾ÈÀüÇÕ´Ï´Ù. Ž»ö±âµµ ÀÌ¿Í °°Àº ¹æ¹ýÀ» »ç¿ëÇÕ´Ï´Ù. º¹»ç°¡ ´Ù ³¡³ª¸é ÀÚµ¿ÀûÀ¸·Î returnÀ» ½ÃÅ°±â ¶§¹®¿¡ ½º·¹µå°¡ ¾Ë¾Æ¼­ Á״´Ù. ÀÌ·± ¹æ¹ýÀº ¾²·¹µå°¡ ¿À·£ ½Ã°£À» ÀÛ¾÷Çϴ°æ¿ì¿¡ »ç¿ëÇÑ´Ù. Áï ¾ðÁ¨°¡´Â °á°ú¸¦ ¾ò¾î¼­ ³¡ ³¯¼ö ÀÖ´Â ÀÏÀ» ÇÒ ¶§ »ç¿ëÇÏ°Ô µÇ°í,  ´ë°³ ¹«ÇÑ·çÇÁ¸¦ µ¹¸é¼­ ÇÏ´Â ÀÏÀº AfxEndThread¸¦ »ç¿ëÇؼ­ ³¡³½´Ù.

 

À§ÀÇ Ã¹ ¹ø° ¹æ¹ý°ú °°ÀÌ returnÀ» ¹Þ¾ÒÀ»¶§´Â GetExitCode¸¦ ÀÌ¿ëÇؼ­ °Ë»öÇÒ ¼ö ÀÖ´Â 32bitÀÇ Á¾·á Äڵ带 º¼¼ö ÀÖ´Ù.

 

DWORD dwexitcode;

::GetExitCodeThread( pThread‐>m_hThread, &dwExitCode );

// pThread´Â CwinThread* °´Ã¼ÀÇ º¯¼öÀÌ°í..

// m_hThread ´Â CwinThread³»ºÎÀÇ »ý¼ºµÈ ¾²·¹µå ÇÚµé

 

ÀÌ ¹®ÀåÀº ½ÇÇàÀÌ Á¾·áµÈ ½º·¹µåÀÇ »óŸ¦ º¸¿©ÁÖ´Â ¹®ÀåÀÌ´Ù. dwExitCode¿¡ ½º·¹µå°¡ return Çϸ鼭 ³ª¿Â 32bitÀÇ Á¾·á°ªÀÌ µé¾î°¡°Ô µÈ´Ù. ¸¸¾à ½ÇÇàÁßÀÎ ½º·¹µå¸¦ ´ë»óÀ¸·Î Àú Äڵ带 ¾²°Ô µÈ´Ù¸é dwExitCode¿¡´Â STILL_ACTIVE¶ó´Â °ªÀÌ µé¾î°¡°Ô µÈ´Ù.

±×·±µ¥, À§ÀÇ Äڵ带 »ç¿ëÇÔ¿¡ ÀÖ¾î Á¦¾àÀÌ ÀÖ´Ù. CwinThread*°´Ã¼´Â ½º·¹µå°¡ return µÇ¾î¼­ ½º½º·Î Á¾·á°¡ µÇ¸é CwinThread °´Ã¼ Àڽŵµ È¥ÀÚ Á¦°ÅµÇ¾î ¹ö¸°´Ù. µû¶ó¼­ delete½ÃÄÑÁÖÁö ¾Ê¾Æµµ ¸Þ¸ð¸®¿¡¼­ ¾Ë¾Æ¼­ ¾ø¾îÁø´Ù.

returnÀÌ µÇ¾î¼­ ÀÌ¹Ì Á×¾î¹ö¸° ½º·¹µå¸¦ °¡Áö°í pThread‐>m_hThread¸¦ ³Ö¾îÁÖ¸é, ÀÌ°ÍÀº ÀÌ¹Ì returnµÇ¾î Á×¾î¹ö¸° ½º·¹µåÀÇ ÇÚµéÀ» °¡¸®Å°°í,  AccessÀ§¹ÝÀ̶õ error¸Þ½ÃÁö°¡ ³ª¿À°Ô µÈ´Ù.

ÀÌ·± ¹®Á¦¸¦ ÇØ°áÇÏ·Á¸é CwinThread* °´Ã¼¸¦ ¾òÀº ´ÙÀ½ ÀÌ °´Ã¼ÀÇ ¸â¹ö º¯¼öÀÎ m_hAutoDelete¸¦ FALSE·Î ¼³Á¤ÇÏ¸é ½º·¹µå°¡ returnÀ» Çصµ CwinThread°´Ã¼´Â ÀÚµ¿À¸·Î Á¦°Å µÇÁö ¾Ê±â ¶§¹®¿¡ À§ÀÇ ÄÚµå´Â Á¤»óÀûÀ» ¼öÇàµÈ´Ù.

 

ÀÌ·± °æ¿ì¿¡ CwinThread*°¡ ´õ ÀÌ»ó ÇÊ¿ä°¡ ¾ø¾îÁö¸é °³¹ßÀÚ ½º½º·Î CwinThread¸¦ delete½ÃÄÑ ÁÖ¾î¾ß ÇÕ´Ï´Ù.  ¶Ç ´Ù¸¥ ¹æ¹ýÀ¸·Î ½º·¹µå°¡ °¡µ¿ÀÌ µÇ¸é CwinThread*ÀÇ ¸â¹öº¯¼öÀÎ m_hThread¸¦ ´Ù¸¥ °÷À¸·Î ÀúÀåÀ» Çسõ°í ÀÌ °ÍÀ» Á÷Á¢GetExitCode()¿¡ Àü´ÞÀ» ÇÏ¸é ±× ¾²·¹µå°¡ ½ÇÇàÁßÀÎÁö ÇѶ§´Â ½ÇÇàµÇ°í ÀÖ¾úÁö¸¸ Á×¾î¹ö¸° ½º·¹µåÀÎÁö È®ÀÎÀÌ °¡´ÉÇÏ´Ù.

 

int a = 100;              // ÆĶó¹ÌÅÍ·Î ³Ñ°ÜÁÙ Àü¿ªº¯¼ö.

CwinThread* pThread   // Àü¿ª ¾²·¹µå °´Ã¼ÀÇ Æ÷ÀÎÅÍ º¯¼ö.

HANDLE threadhandle;  // ½º·¹µåÀÇ ÇÚµéÀ» ÀúÀåÇÒ Çڵ麯¼ö.

 

Initinstance() // ÇÁ·Î±×·¥ÃʱâÈ­.

{

     // ÇÁ·Î±×·¥ ½ÇÇà°ú µ¿½Ã¿¡ ½º·¹µå ½ÃÀÛ.

     1¹ø¹æ¹ý:pThread = AfxBeginThread( func, (int) a );

     // ½º·¹µå°¡ ¸®ÅϵǸé ÀÚµ¿À¸·Î CwinThread°´Ã¼°¡ ÀÚµ¿À¸·Î Æı«µÇÁö ¾Ê°Ô ¼³Á¤.

     2¹ø¹æ¹ý:pThread‐>m_hAutoDelete = FALSE;

     // ¾²·¹µå Çڵ带 ÀúÀå. À§ÀÇ m_hAutoDelete¸¦ ¼³Á¤ÇÏÁö¾Ê¾ÒÀ»°æ¿ì..

     threadhandle = pThread‐>m_hThread;

}

 

MessageFunction()  // ¾î¶² ¹öÆ°À» ´­·¯¼­ ½º·¹µåÀÇ »óŸ¦ ¾Ë°í ½Í´Ù..

{

     char* temp;

     DWORD dwExitcode;

     // ½º·¹µå °´Ã¼ÀÇ m_hAutoDelete¸¦ fasle·Î ¼³Á¤Çؼ­ ½º·¹µå°¡ returnµÇ¾îµµ

     // °´Ã¼°¡ ÀÚµ¿À¸·Î Æı«µÇÁö ¾Ê¾Æ¼­ ÇÚµéÀ» ÂüÁ¶ ÇÒ¼ö ÀÖ´Ù.

     1¹ø¹æ¹ý:         ::GetExitCode( pThread‐>m_hThread, &dwExitcode);

     // ½º·¹µå°¡ Á¾·áµÇ°í ¹Ì¸® ÀúÀåÇصРÇÚµéÀ» ÀÌ¿ëÇÒ°æ¿ì..

     2¹ø¹æ¹ý:         ::GetExitCode(threadhandle, &dwExitcode);

     sprintf( temp, “Error code : %d”, dwExitcode );

     // ½º·¹µå °´Ã¼ »èÁ¦..

     1¹ø¹æ¹ý:         delete pThread;

     AfxMessageBox( temp );

}

 

func( void* pParam )

{

     int b = (int) pParam;

     for( int I = 0; I < b; I++)

     {

     // ¾î¶²ÀÏÀ» ÇÑ´Ù. 

     }

return;  // ÀÛ¾÷ÀÌ ³¡³ª¸é ¸®ÅÏÇÑ´Ù. À̶§ ½º·¹µå ÀÚµ¿À¸·Î Á¾·á.

}

 

À§ÀÇ ÄÚµå´Â ¾î¶°ÇÑ ÀÛ¾÷À» ¼öÇàÇÏ´Â ¾²·¹µå¸¦ µ¹¸®°í ÀÛ¾÷ÀÌ ³¡³ª¸é ÀÚ¿¬ÀûÀ¸·Î ¸®ÅÏÀ» ½ÃÅ°´Â °¡»ó ÄÚµåÀÌ´Ù.

 

1¹ø° ¹æ¹ýÀº ½º·¹µå¸¦ »ý¼ºÇÏ°í m_hAutoDelete¸¦ false·Î Çؼ­ ½º·¹µå°¡ returnÇؼ­ ÀÚµ¿Á¾·áÇصµ CwinThread¸¦ ÀÚµ¿Æı«ÇÏÁö ¾Ê°Ô ÇÏ°í, GetExitCodeThread()¸¦ È£ÃâÇÑ´Ù. ¹Ø¿¡¼­ delete ´Â ²À ÇؾßÇÑ´Ù.

 

2¹ø°´Â m_hThread¸¦ ´Ù¸¥ Çڵ麯¼ö¿¡ ÀúÀåÇØ ³õ°í..½º·¹µå°¡ returnµÇ¸é CwinThread*µµ °°ÀÌ Æı«°¡ µÈ´Ù. ¿ø·¡ ÀúÀåÇÑ ÇÚµéÀ» °¡Áö°í GetExitcodeThread()¸¦ È£ÃâÇؼ­ ÇѶ§ Á¸ÀçÇßÁö¸¸ Á¾·áµÈ ¾²·¹µå¸¦ °Ë»çÇÏ´Â °ÍÀÌ´Ù.

 

7. ½º·¹µå Á¶ÀÛ

¡Ý ÇϳªÀÇ ½º·¹µå¿¡¼­ ´Ù¸¥ ½º·¹µå Á¾·á½ÃÅ°±â..

 

¨ç ================================================================================

µÎ°³ÀÇ ½º·¹µå°¡ µ¿ÀÛÇÏ°í ÀÖÀ» ¶§ ÇϳªÀÇ ½º·¹µå¿¡¼­ ´Ù¸¥ ½º·¹µå¸¦ ÀϹæÀûÀ¸·Î Á¾·á½ÃÅ°´Â ¹æ¹ýÀ» ¾Ë¾Æº»´Ù.

*** ½º·¹µå A ***

static BOOL bContinue = TRUE;

CwinThread* pThread = AfxBeginThread( func(), &bContinue ) 

//.........

bContinue = FALSE;

 

*** ½º·¹µå B ****

UINT func( LPVOID pParam )

{

     BOOL* pContinue = (BOOL*)pParam; //½º·¹µå A¿¡¼­ ³Ñ°ÜÁØ Á¾·áÇ÷¡±×

     While( *pContinue )

     {

     //..........

     }

     return 0;          // ³¡³ª¸é ½º·¹µå B ÀÚµ¿Á¾·á.

}

 

ÀϹÝÀûÀ¸·Î ½º·¹µå »çÀÌ¿¡¼­ ¼­·Î¸¦ »ç»ìÇÒ ¶§ ¸¹ÀÌ ¾²´Â ¹æ¹ýÀÔ´Ï´Ù. ÀÌ ¹æ¹ýÀº º¸Åë BOOLÇü½ÄÀÇ Ç÷¡±×¸¦ Çϳª µÒÀ¸·Î½á ±× °ªÀ» ¾î¶² ½º·¹µå¿¡¼­ º¯ÇüÇÏ¿© ´Ù¸¥ ½º·¹µå¿¡¼­ ±× °ªÀÇ º¯È­¸¦ ÀÎÁöÇÏ°Ô ÇÔÀ¸·Î½á ½º·¹µå¸¦ ÀÚµ¿Á¾·á( return )½ÃÄѹö¸®´Â °ÍÀÌ´Ù. º¸Åë ÀÌ°ÍÀº ½º·¹µåµéÀÌ Åë½ÅÇϱ⿡ ÀûÇÕÇÏÁö ¾ÊÀº ¹æ½ÄÀ̶ó°í ¸¹Àº ¼­Àû¿¡¼­ ¼³¸íÇÏ°í ÀÖ´Ù. º¸ÅëÀº ½º·¹µåµéÀÇ µ¿±âÈ­ °´Ã¼¸¦ ÀÌ¿ëÇÏ´Â ÀûÀÌ È¿°úÀûÀÎ ¹æ¹ýÀÌ´Ù.

 

¿ì¼±Àº ½º·¹µå A¿¡¼­ static ÇüÀÇ Á¤ÀûÀÎ BOOLÇü º¯¼ö¸¦ Çϳª ¸¸µç´Ù. StaticÀ¸·Î ¼±¾ðµÈ º¯¼ö´Â ÇÁ·Î±×·¥ÀÌ »ý¼ºµÊ°ú µ¿½Ã¿¡ ÀÚµ¿À¸·Î ¸Þ¸ð¸®¿¡ ¿Ã¶ó°¡ ÀÖ°Ô µÈ´Ù. ±×·¡¼­ ±× º¯¼ö°¡ ¼±¾ðµÈ ºí·ÏÀ» ºüÁ® ³ª¿À°Ô µÇ´õ¶óµµ °è¼ÓÀûÀ¸·Î ±× °ªÀ» À¯ÁöÇÏ°í ÀÖ´Ù. ±×·¡¼­ staticÀ̶ó°í Ç÷¡±× º¯¼ö¸¦ ¼±¾ðÇÏ°í TRUE·Î ÃʱâÈ­ ½ÃÄÑ µÐ´Ù.

 

±×·¯¸é ½º·¹µå B´Â BOOLÇü °ªÀÇ Ç÷¡±×¸¦ ÆÇ´ÜÇÏ¿© ½ÇÇà¿©ºÎ¸¦ °áÁ¤ÇÏ´Â while·çÇÁ¾È¿¡´Ù°¡ ½º·¹µå¿¡¼­ ¼öÇàÇØ¾ß ÇÒ ÀÏÀ» ³Ö¾îÁÖ°í, ½º·¹µå A¿¡¼­ ´õ ÀÌ»ó B°¡ Á¸ÀçÇÒ ÀÌÀ¯°¡ ¾ø´Ù°í »ý°¢Çϸé Ç÷¡±×ÀÇ °ªÀ» FALSE ·Î º¯°æ½ÃÄѼ­ ½º·¹µå B¸¦ ÀÚ¿¬½º·´°Ô Á×°ÔÇÑ´Ù.

±×·±µ¥ ÀÌ ¹æ¹ýÀº ´ëºÎºÐ »ç¿ëµÇÁö ¾Ê´Â´Ù.(ºñÈ¿À²ÀûÀ̹ǷÎ) ¿Ö³ÄÇϸé, ½º·¹µå A¿¡¼­ bContinue = FASLE·Î ¼³Á¤ÇÑ ´ÙÀ½ ¾î¶² ÀÛ¾÷À» ´Ù½Ã µé¾î°¡´Âµ¥, ¸¸¾à CPU¿¡¼­ ½º·¹µå ½ºÄÉÁÙ¸µÀ» À߸øÇÏ¿© ½º·¹µå B°¡ Á¾·áµÇ±â Àü¿¡ ½º·¹µå A¿¡¼­ ¶Ç ´Ù¸¥ ¾î¶² ÀÛ¾÷À» µé¾î°¡¾ß ÇÑ´Ù¸é, ¿øÇÏÁö ¾Ê¾Ò´ø °á°ú¸¦ ÃÊ·¡ÇÑ´Ù. 

 

¨è ================================================================================

±×·¡¼­ ¿ì¸®´Â À̶§ ½º·¹µå A¿¡¼­ ½º·¹µå B°¡ Á×À» ¶§±îÁö ±â´Ù¸®´Â ¸ÅÄ¿´ÏÁò(¹æ¹ý)ÀÌ ÇÊ¿äÇÏ´Ù.

 

// ½º·¹µå A

static BOOL bContinue = TRUE;

CwinThrad* pThread = AfxWinThread( func(), &bContinue );

// ¾î¶²ÀÏ ¼öÇà.

// »ý¼ºµÈ ½º·¹µåÀÇ ÇÚµéÀ» HANDLEº¯¼ö¿¡ ÀúÀå.

HANDLE hthread = pThread‐>m_hThread;   //m_hThread´Â »ý¼ºµÈ ½º·¹µåÀÇ ÇÚµé

 

BContinue = FALSE;

::WaitForSingleObject( hthread, INFINITE );  //Á¹¶ó¸® Áß¿äÇÑ ÇÔ¼öÀÓ´Ù

 

// ½º·¹µå B

UINT func( LPVOID pParam )

{

     BOOL* pContinue = (BOOL*) pParam;

     While( *pContinue )

     {

             // ¾î¶²ÀÏ ¼öÇà.

     }

     return 0;

}

 

WaitForSingleObject¶õ Win32ÇÔ¼öÀÇ ÇÁ·ÎÅäŸÀÔÀº ´ÙÀ½°ú °°´Ù.

     DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilisecond );

ù¹ø° ÀÎÀÚ·Î ÁÖ¾îÁø Çڵ鿡 À§ÀÇ ¿¹¹®¿¡¼­ ½ÇÇà½ÃŲ ½º·¹µåÀÇ Çڵ鰪À» ÀúÀåÇÑ´Ù. ±×¸®°í µÎ¹ø° ÀÎÀÚ·Î ½Ã°£°ªÀ» ¹Þ´Âµ¥, ÀÌ °ªÀº ¾î¶² ÇൿÀÌ ÀϾ±â±îÁö ±â´Ù¸± ½Ã°£À» ¸»ÇÑ´Ù. ÀÌ ÇÔ¼öÀÇ ¸ñÀûÀº ù¹ø° Çڵ鰪À¸·Î ÁÖ¾îÁø ±× Çڵ鿡 ´ëÇÑ ÇØ´çÇÏ´Â ¾î¶²°´Ã¼(?)°¡ “½ÅÈ£¸¦ ¹ÞÀº »óÅ” °¡ µÉ ¶§±îÁö ±â´Ù¸°´Ù. ¿¹Á¦¸¦ º¸¸é ½º·¹µåA°¡ ½º·¹µåB¸¦ Á¾·á½ÃÅ°·Á°í Á¾·áÇ÷¡±×¸¦ FALSE·Î ¼ÂÆÃÇÏ°í waitforsingleobject()¸¦ È£ÃâÇÏ°í Àִµ¥, À̶§ ½ÅÈ£¸¦ ¹Þ¾Æ¾ßÇÏ´Â °´Ã¼·Î ½º·¹µåBÀÇ ÇÚµéÀ» ÁöÁ¤ÇÏ´Â °ÍÀÌ´Ù. ÀÌ ¸»Àº ½º·¹µå B°¡ Á¤»óÀûÀ̵ç, ȤÀº Á¾·á½ÅÈ£°¡ ¿Ã ¶§±îÁö ±â´Ù¸°´Ù´Â ÀǹÌÀÌ´Ù.

³×Æ®¿÷ ÇÁ·Î±×·¥¿¡¼­ ¾î¶² ÆÄÀÏÀ» ¹Þ´Â ½º·¹µå°¡ ÀÖ°í, ÀÌ ¹ÞÀº µ¥ÀÌÅÍ·Î ¸Õ°¡¸¦ ÀÛ¾÷ÇÏ´Â ½º·¹µå 2°³°¡ Á¸ÀçÇÑ´Ù¸é ¸ðµç µ¥ÀÌÅÍ°¡ ´Ù ¹Þ¾Æ Áú ¶§±îÁö ¹ÞÀº µ¥ÀÌÅÍ·Î ÀÛ¾÷ÇÏ´Â ½º·¹µå´Â ¸ØÃç ÀÖ¾î¾ßÇÑ´Ù. ÀÌ °æ¿ì Àú ÇÔ¼ö¸¦ ÀÌ¿ëÇؼ­ ¹ÞÀº µ¥ÀÌÅÍ·Î ÀÛ¾÷À» ¼öÇàÇÏ´Â ½º·¹µå¸¦ ¸ØÃç µÒÀ¸·Î½á ¾ÈÁ¤ÀûÀ¸·Î ÀÛµ¿ÇÏ°Ô ÇÏ´Â °ÍÀÌ´Ù.

 

À̶§ WaitForSingleObject¿¡ µÎ¹ø° ÀÎÀÚ¿¡ INFINITE¸¦ ³ÖÁö ¾Ê°í 5000À̶ó´Â °ªÀ» ³ÖÀ¸¸é ¹«ÇÑÁ¤ ±â´Ù¸®´Â ´ë½Å ±× ½º·¹µå°¡ ½ÅÈ£¸¦ ¹Þ±â¸¦ ±â´Ù¸®´Â ½Ã°£À» 5Ãʸ¦ ÁöÁ¤ÇÑ °Ì´Ï´Ù. ¿©±â¼­ 5ÃÊ°¡ °æ°úµÈ ÈÄ¿¡µµ ÀÌ °´Ã¼°¡ ½ÅÈ£¸¦ ¹ÞÁö ¸øÇϸé, WaitForSingleObject´Â ¹ÝȯÀÌ µÇ´Âµ¥ ÀÌ ¹ÝȯµÈ °ªÀ» °¡Áö°íµµ ÇÁ·Î±×·¡¸Ó°¡ ½º·¹µåÀÇ »óȲÀ» ÆľÇÇÒ ¼ö ÀÖ´Ù.

     WAIT_OBJECT_0 : °´Ã¼°¡ ½ÅÈ£¸¦ ¹Þ¾ÒÀ½

     WAIT_TIMEOUT   : °´Ã¼°¡ ½ÅÈ£¸¦ ¹ÞÁö ¸øÇßÀ½

 

//½º·¹µå A(¹ÞÀº µ¥ÀÌÅ͸¦ °¡Áö°í ¾î¶² ÀÛ¾÷À» ÇÑ´Ù..)

………

if(::WaitForSingleObjcet(hThread, 5000) == WAIT_TIMEOUT )

{

     AfxMesageBox(“5ÃÊ°¡ Áö³ªµµ·Ï µ¥ÀÌÅÍ ¸ø ¹Þ¾Ò´Ù..¿¡·¯´Ù..”)

}

else

{

     //µ¥ÀÌÅÍ ´Ù ¹Þ¾ÒÀ¸´Ï±î..¾Ë¾Æ¼­..Çضó..

}

 

//½º·¹µå B(µ¥ÀÌÅ͸¦ ¹Þ´Â´Ù..)

…ÀÛ¾÷Áß…

 

´Ù¸¥ ¹æ¹ýÀ¸·Î´Â WaitForSingleObjctÀÇ µÎ¹ø° ÀÎÀÚ¿¡ 0À» ÁöÁ¤ÇÔÀ¸·Î½á ÀÌ ½º·¹µå ÇÔ¼ö°¡ ½ÇÇàÁßÀÎÁö ȤÀº Á¾·á°¡ µÇ¾ú´ÂÁöµµ ¾Ë ¼ö ÀÖ´Ù.

 

if( ::WaitForSingleObjcet( hThread, 0 ) == WAIT_OBJCET_0 )

{

// ½º·¹µå°¡ Á¾·á°¡ ‰ç´ç..
}

else

     // ½º·¹µå°¡ ¾ÆÁ÷ ½ÇÇàÁßÀÌ´Ù..

Áï µÎ ¹ø° ÀÎÀÚ¿¡ 0À̶õ °ªÀ» ÁÖ¸é, ±× ½º·¹µå¿¡ ´ëÇÑ »óŸ¦ ¹Ù·Î ¹ÝȯÇØ ÁÖ°Ô µÈ´Ù.

 

CwinThread*ÀÇ ¸â¹öº¯¼öÁß¿¡ ÇϳªÀÎ m_bAutoDelete¸¦ false·Î ¼³Á¤ÇØ ³õÁöµµ ¾Ê°í, CwinThread°¡ ½ÅÈ£¸¦ ¹Þ¾Ò´ÂÁö ¾Ë±âÀ§Çؼ­ WaitforSingObject¸¦ È£ÃâÇÏ´Â °ÍÀº ¸»ÀÌ ¾ÈµË´Ï´Ù. ÀÌÀ¯´Â ±× ½º·¹µå°¡ ³¡À̳ª¸é ÇØ´ç CwinThread*°´Ã¼ ¶ÇÇÑ ÀÚµ¿À¸·Î »ç¶óÁö±â ¶§¹®¿¡, m_bAutoDelete¸¦ false·Î ÇØÁÖÁö ¾ÊÀ¸¸é, ¸»ÀÌ ¾ÈµÈ´Ù.

 

¨é ================================================================================

¸¶Áö¸· ¹æ¹ýÀº ::TerminateThread( pThread‐>m_hThread , 0 ); ÀÌ´Ù.

ÀÌ°ÍÀº ¾î¶² ½º·¹µå¿¡¼­ ´Ù¸¥ ½º·¹µå¸¦ Á¾·á½Ãų ¶§ ÃÖÈÄÀÇ ¼ö´ÜÀ¸·Î ¾µ ¶§ ¿ä±äÇÏ´Ù. À§ÀÇ ÇÔ¼ö¸¦ »ç¿ëÇϸé pThread‐>m_hThread¸¦ Á¾·áÇÏ°í, ±× ½º·¹µå¿¡ Á¾·áÄÚµå 0À» ÇÒ´çÇÑ´Ù. ÀÌ ÇÔ¼ö´Â »ç¿ëÇÔ¿¡ ÀÖ¾î Á¦¾àÀÌ ¸¹ÀÌ µû¸¥´Ù.

¿¹¸¦ µé¾î µ¿±âÈ­ °´Ã¼¸¦ ¿¹·Î µé¼ö Àִµ¥, ¾î¶² µ¿±âÈ­ °´Ã¼¸¦ °øÀ¯ÇÏ´Â ½º·¹µåµéÀÌ Àִµ¥.. ¾î¶² ½º·¹µå°¡ °øÀ¯ÇÏ´Â µ¿±âÈ­ °´Ã¼¸¦ LockingÇÏ°í ÀÛ¾÷À» ¼öÇàÇÏ´øÁß,(À̶§ ´Ù¸¥ ½º·¹µåµéÀº °øÀ¯ µ¿±âÈ­ °´Ã¼¸¦ ¾ò±â À§ÇØ ´ë±â»óÅ¿¡ ÀÖ´Ù) À§ÀÇ TerminateThreadÇÔ¼ö¸¦ »ç¿ëÇؼ­ ÀÛ¾÷ÁßÀÎ ½º·¹µå¸¦ Á×À̸é, °øÀ¯µÈ µ¿±âÈ­ °´Ã¼¸¦ UnLockingÇϱâ Àü¿¡ Á×¾î ¹ö¸± ¼ö ÀÖ°Ô µÈ´Ù. ÀÌ·¯¸é °øÀ¯µÈ µ¿±âÈ­ °´Ã¼´Â ¿µ¿øÈ÷ LockingµÇ¾î Àֱ⠶§¹®¿¡ ±× µ¿±âÈ­ °´Ã¼¸¦ °øÀ¯ÇÏ´Â ´Ù¸¥ ½º·¹µåµéÀº ½ÇÇàÀÌ ¾È µÇ°Ô µÈ´Ù.

 

 

  µî·ÏÀÏ : 2014-06-16 [19:50] Á¶È¸ : 3506 ´Ù¿î : 327   
 
¡â ÀÌÀü±Ûinsert_node ½ÇÇà ¿¹Á¦
¡ä ´ÙÀ½±ÛThead ÀÇ »ç¿ë
ÀڷᱸÁ¶ ÆÁ
¹øÈ£ ¨Ï Á¦ ¸ñ À̸§ Á¶È¸ µî·ÏÀÏ
19 Dos Prompt â Å©±â Á¶Á¤ ¹æ¹ý ÇÔ¼ö Á¤¼ºÈÆ 101 01-01
18 °ÔÀÓ°³¹ß Áß »ç¿ëÀÚ Ä³¸¯ÅÍ ¿òÁ÷ÀÓ Å°º¸µå ÀÔ·Â ½Ã¿¡¸¸ ¹è°æÀÌ ¿òÁ÷ÀÏ ¶§ ó¸® ¹æ¹ý ÇÔ¼ö Á¤¼ºÈÆ 176 12-05
17 (chatGPT) ±¸Á¶Ã¼ local º¯¼ö 0À¸·Î ÃʱâÈ­ ¹æ¹ý ÇÔ¼ö Á¤¼ºÈÆ 251 11-28
16 ÀÌÁøŽ»öÆ®¸®¿¡¼­ »èÁ¦¿¬»ê ¼³¸í ÇÔ¼ö Á¤¼ºÈÆ 1172 05-30
15 insert_node ½ÇÇà ¿¹Á¦ ÇÔ¼ö Á¤¼ºÈÆ 1273 05-09
14 ¦¦❶ ppt ÆÄÀÏ ÇÔ¼ö Á¤¼ºÈÆ 1077 05-09
13 lThead ÀÇ »ç¿ë ÇÔ¼ö Á¤¼ºÈÆ 1749 06-10
12 ¦¦❶ lThead Á×À̱â ÇÔ¼ö Á¤¼ºÈÆ 3506 06-16
11 ¦¦❶ lThead ÀÇ °³³ä µ¿ÀÛ Á¤¼ºÈÆ 2120 06-10
10 ¦¦❶ l¾²·¹µå µ¿±âÈ­(Ä¿³Î¸ðµå1. Mutex) ÇÔ¼ö Á¤¼ºÈÆ 2242 06-10
9 À½¾Ç Ç÷¹ÀÌ ÇÁ·Î±×·¥ ÇÔ¼ö Á¤¼ºÈÆ 1782 06-08
8 lgetchar(), getch(), getche() Â÷ÀÌ ÇÔ¼ö Á¤¼ºÈÆ 1644 10-19
7 fflush »ç¿ëÀÌÀ¯ ¹× ¹æ¹ý ÇÔ¼ö Á¤¼ºÈÆ 1507 06-19
6 linked list ÀÇ head pointer´Â mallocÀÌ ÇÊ¿äÇÏÁö ¾ÊÀ½ µ¿ÀÛ Á¤¼ºÈÆ 1699 05-02
5 double pointerÀÇ »ç¿ë µ¿ÀÛ Á¤¼ºÈÆ 1656 04-15

[1][2]