|
1. ¿ä¾à VolatileÀº ¡®Èֹ߼ºÀÇ¡¯ ¶ó´Â ¶æÀ» °¡Áö°í ÀÖ½À´Ï´Ù. Volatile Ű¿öµå¸¦ »ç¿ëÇØ¼ Á¤ÀÇÇÑ º¯¼ö´Â ±×°ÍÀ» »ç¿ëÇÏ´Â ¹®Àå(statement)¿Ü¿¡ ´Ù¸¥ °Í¿¡ ÀÇÇØ¼ º¯°æµÉ ¼ö ÀÖ´Ù´Â Àǹ̸¦ °®½À´Ï´Ù. ´Ù¸¥ °ÍÀ̶õ ¿î¿µÃ¼Á¦, Çϵå¿þ¾î ȤÀº ´Ù¸¥ ½º·¹µå°¡ µÉ ¼ö ÀÖ½À´Ï´Ù. ±×·¯¹Ç·Î Volatile Ű¿öµå¸¦ »ç¿ëÇØ¼ Á¤ÀÇÇÑ º¯¼ö´Â ´«¿¡ º¸ÀÌ´Â ¹®À常À» »ó´ë·Î ÇԺηΠÃÖÀûÈ ½ÃŰÁö ¸»¾Æ¾ß ÇÔÀ» ÀǹÌÇÕ´Ï´Ù. ÀÌ ±Û¿¡¼´Â °£´ÜÇÑ »ç¿ë¹ý°ú Volatile Ű¿öµåÀÇ À¯¹«¿¡ µû¶ó¼ ÄÄÆÄÀÏ·¯°¡ »ý»êÇØ³»´Â Äڵ尡 ¾î¶»°Ô ´Þ¶óÁö´ÂÁö ¾Ë¾Æº¸°Ú½À´Ï´Ù. 2. º»¹® (1) »ç¿ë¹ý »ç¿ë¹ýÀº °£´ÜÇÕ´Ï´Ù. volatile int k;ÀÌÁ¦ k´Â ÄÄÆÄÀÏ·¯°¡ ÇԺηΠÃÖÀûÈ ½ÃŰÁö ¾Ê½À´Ï´Ù. (2) Loop¸¦ µ¹¸ç ÀÏÇÏ´Â Worker Thread ÇÁ·Î¼¼½º°¡ »ý¼ºµÇ¸é¼ ÇÔ²² »ý¼ºµÇ´Â ¸ÞÀÎ ½º·¹µå°¡ ¾Æ´Ï¶ó¸é, ´ëºÎºÐÀÇ °æ¿ì´Â ¸ÞÀνº·¹µå°¡ ½ÅÈ£¸¦ º¸³»ÁÙ ¶§±îÁö ·çÇÁ¸¦ µ¹¸é¼ ¹Ýº¹ÀÛ¾÷À» ÇÕ´Ï´Ù. ´ÙÀ½°ú °°Àº ½º·¹µå ÀÔ±¸(Entry)ÇÔ¼ö°¡ ÀÖ´Ù°í ÇսôÙ.
void ThreadEntry(void* pParm)
{
bool* pbExit = static_cast<bool*>(pParm);
int i = 0;
while( !*pbExit)
{
i++;
}
printf("i = %d\n" ,i);
}
¸ÞÀÎ ½º·¹µå°¡ ³Ñ°ÜÁØ bool º¯¼ö°¡ true°ªÀ» °¡Áú ¶§±îÁö °è¼ÓÇØ¼ iÀÇ °ªÀ» 1¾¿ ´õÇÏ´Â ·çƾÀÔ´Ï´Ù. *pbExit°¡ true°¡ µÇ´Â ¼ø°£¿¡ while¹®À» ºüÁ® ³ª¿À°í ÀÌ ¿öÄ¿ ½º·¹µå( ÀÌ·¸°Ô ºÎ¸£±â·Î ÇսôÙ)´Â Á¾·áÇÏ°Ô µË´Ï´Ù. ¹°·Ð Debug ¸ðµå·Î ÄÄÆÄÀÏ ÇϽŴٸé À§ÀÇ ½Ã³ª¸®¿À´ë·Î Àß ÀÛµ¿ÇÒ °Ì´Ï´Ù. ÇÏÁö¸¸ Release ¸ðµå·Î ÄÄÆÄÀÏ ÇÏ½Å´Ù¸é ¾Æ¸¶µµ ¿öÄ¿ ½º·¹µå´Â Á¤»óÀ¸·Î Á¾·áÇÒ ¼ö ¾øÀ» °Ì´Ï´Ù. ±× ÀÌÀ¯´Â Release ¸ðµå¿¡¼´Â ÄÄÆÄÀÏ·¯°¡ ÃÖÀûȸ¦ Çϱ⠶§¹®ÀÔ´Ï´Ù. À§ÀÇ Äڵ带 ´Ù½Ã º¸½Å´Ù¸é, ÇÔ¼ö ³»¿¡¼ *pbExit ÀÇ °ªÀ» º¯°æ½ÃŰ´Â ºÎºÐ( Àд ºÎºÐ¸¸ ÀÖÁÒ)Àº ¾ø´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù. ±× °á°ú ÄÄÆÄÀÏ·¯´Â ±»ÀÌ *pbExitÀÇ °ªÀ» ¸Å¹ø ºñ±³ÇÒ Çʿ䰡 ¾ø´Ù°í »ý°¢Çϰí´Â *pbExit°¡ trueÀÎÁö ºñ±³ÇÏ´Â Äڵ带 Á¦°ÅÇØ¹ö¸° °ÍÀÔ´Ï´Ù. ÇØ°áÃ¥Àº ´ÙÀ½°ú °°½À´Ï´Ù. volatile bool* pbExit = static_cast<volatile bool*>(pParm); ÀÌÁ¦ ÄÄÆÄÀÏ·¯´Â ¼²ºÒ¸® ÃÖÀûÈÇÏÁö ¾ÊÀ» °ÍÀ̰í, Release ¸ðµå¿¡¼ Á¤»ó Á¾·áÇÏ´Â ÁÁÀº Äڵ尡 µÇ¾ú½À´Ï´Ù. volatileÀÇ À¯¹«¿¡ µû¶ó ÄÄÆÄÀÏ·¯°¡ »ý»êÇÏ´Â Äڵ尡 3. ¿¹Á¦ Äڵ忡 ÀÖÀ¸´Ï ÂüÁ¶ÇϽñ⠹ٶø´Ï´Ù. Release ¸ðµå¿¡¼ ¾î¼ÀºíµÈ Äڵ带 º¸½Ã·Á¸é ÄÄÆÄÀÏ·¯ ¿É¼Ç¿¡¼ /FAcs¸¦ Ãß°¡ÇÏ½Ã¸é µË´Ï´Ù. ±×·¯¸é *.cod¶ó´Â À̸§ÀÇ ÆÄÀÏÀÌ »ý¼ºµË´Ï´Ù. 3. ¿¹Á¦ ÄÚµå (1) Volatile¾ø´Â °æ¿ì
; 12 : bool* pbExit = static_cast<bool*>(pParm);
; 13 : int i = 0;
; 14 :
; 15 : while( !*pbExit)
00000 8b 4c 24 04 mov ecx, DWORD PTR _pParm$[esp-4]
00004 33 c0 xor eax, eax
00006 80 39 00 cmp BYTE PTR [ecx], 0
00009 75 03 jne SHORT $L42424
$L42423:
; 16 : {
; 17 : i++;
0000b 40 inc eax
; 12 : bool* pbExit = static_cast<bool*>(pParm);
; 13 : int i = 0;
; 14 :
; 15 : while( !*pbExit)
//////////////////////////////////////////////////////////
// ÀÌ ºÎºÐ º¸À̽ÃÁÒ? ºñ±³µµ ¾ÈÇÏ°í ¹«Á¶°Ç Á¡ÇÁÇÏ´Â ¸ð½À!!
0000c eb fd jmp SHORT $L42423 ->
$L42424:
; 18 : }
(2) VolatileÀÖ´Â °æ¿ì
; 12 : volatile bool* pbExit = static_cast<volatile bool*>(pParm);
; 13 : int i = 0;
; 14 :
; 15 : while( !*pbExit)
00000 8b 4c 24 04 mov ecx, DWORD PTR _pParm$[esp-4]
00004 33 c0 xor eax, eax
00006 80 39 00 cmp BYTE PTR [ecx], 0
00009 75 07 jne SHORT $L42424
$L42423:
; 16 : {
; 17 : i++;
0000b 40 inc eax
////////////////////////////////////////////////
// ÀÌ ºÎºÐ º¸À̽ÃÁÒ?? ºñ±³Çؼ ºÐ±âÇÏ´Â ¸ð½À!!
0000c 8a 11 mov dl, BYTE PTR [ecx]
0000e 84 d2 test dl, dl
00010 74 f9 je SHORT $L42423
$L42424:
; 18 : }
- 2001.08.06 Smile Seo - |