Volatile


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 -