| ÀÌÀü ÁÖÁ¦ º¸±â :: ´ÙÀ½ ÁÖÁ¦ º¸±â |
| ±Û¾´ÀÌ |
¸Þ½ÃÁö |
ºñȸ¿ø ¼Õ´Ô
|
Interlock °è¿ÀÇ ÇÔ¼öÁß ºñ±³¿¡ °üÇÑ°Ç ¾ø´Â°Å °°Àºµ¥¿ä.. |
¿Ã·ÁÁü: 2009-03-13 01:07
|
|
Interlock °è¿ ÇÔ¼öµéÀ»º¸¸é Write¿¡ °üÇѰÍÀº API°¡ Àִµ¥ read¿¡ °üÇѺκÐÀº ¾ø³×¿ä
ºñ±³ ÇÒ¶§´Â Interlock °°Àº °è¿ÇÔ¼ö¸¦ ÅëÇÏÁö ¾Ê°í ±×³É ºñ±³ ÇØµµ µÇ´Â°É±î¿ä? |
|
| À§·Î |
|
 |
ºñȸ¿ø ¼Õ´Ô
|
|
¿Ã·ÁÁü: 2009-03-13 03:18
|
|
´ç¿¬ÇÕ´Ï´Ù. ¼ö½Ê°³ ¾²·¹µå°¡ µ¿½Ã¿¡ read ¸¦ ÇØµµ µ¥ÀÌŸ´Â ¸Á°¡ÁöÁö ¾Ê±â ¶§¹®ÀÔ´Ï´Ù.
±×·¯³ª º¯ÇÒ¸¸ÇÑ º¯¼ö¸¦ ÀоúÀ» ¶§ read °á°ú·Î ¾î¶² °ªÀÌ µé¾î¿Í ÀÖÀ» Áö´Â ¾Ë¼ö ¾ø½À´Ï´Ù.
ÇÏÁö¸¸ ¿ÏÀü ½ß¶×¸ÂÀº °ªÀº ¾Æ´Õ´Ï´Ù.
¿¹¸¦µé¾î ´Ù¸¥ ¾²·¹µå¿¡¼ ¹Ù²Ù´Â ÁßÀÎ 32bit Á¤¼öÀÇ ºñÆ® ÀϺκи¸ ¹Ù²î¾î Àִٰųª ÇÏÁö´Â ¾ÊÁö¿ä. |
|
| À§·Î |
|
 |
Á¶¼º°æ
°¡ÀÔ: 2005³â 12¿ù 13ÀÏ ¿Ã¸° ±Û: 307
|
|
¿Ã·ÁÁü: 2009-03-13 08:58
|
|
À§ÀÇ ºñȸ¿ø´Ô²²¼ ¸»¾¸ÇϽŰÍó·³ ´ëºÎºÐÀÇ °æ¿ì¿¡ Àбâ´Â ¾ÈÀüÇÕ´Ï´Ù. ±×·¯³ª ÃÖÀûȰ¡ °ü·ÃµÇ¾úÀ»¶§´Â Àç¹Õ´Â Çö»óÀÌ ¹ß»ýÇÒ ¼ö ÀÖ½À´Ï´Ù. ÄÄÆÄÀÏ·¯°¡ ÃÖÀûȸ¦ À§Çؼ ¹®ÀåÀÇ ½ÇÇà ¼ø¼¸¦ ¹Ù²Ù±âµµ Çϰŵç¿ä.
±×·¯´Ï±î ´Ù¸¥ ¾²·¹µå¿¡¼ ¹Ù²Ü ¼ö ÀÖ´Â °ªÀ» Á¶°ÇÀ¸·Î ¹®ÀåÀÇ ½ÇÇà ¼ø¼¸¦ »ý°¢Çϰí ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ¸é ¿ô±â´Â Çö»óÀÌ ¹ß»ýÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·± ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ volatile°°Àº ¿¹¾à¾î¸¦ »ç¿ëÇϰųª _Read(Write)Barrier intrinsic°°Àº °ÍÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
±×·¯³ª volatileÀ» ¾²´Â°Ô »ðÁúÀÌ´Ù!!¶ó´Â ÃÖ±ÙÀÇ Ãß¼¼¸¦ Àû¿ëÇØ º¼ ¶§ ¾µ°÷°ú ¾È¾µ°÷À» Á¤È®È÷ ÆÄ¾ÇÇÏ´Â°Ç º»ÀÎÀÇ ¼±ÅÃÀÔ´Ï´Ù(¹«Ã¥ÀÓÇÏÁÒ?) _________________ ´õ ÀÌ»ó ÀÌ °÷¿¡ ¿ÀÁö ¾Ê½À´Ï´Ù. |
|
| À§·Î |
|
 |
magicpotato
°¡ÀÔ: 2003³â 9¿ù 29ÀÏ ¿Ã¸° ±Û: 21
|
|
¿Ã·ÁÁü: 2009-03-13 11:04
|
|
| Á¶¼º°æ ¾¸: |
| ±×·¯³ª volatileÀ» ¾²´Â°Ô »ðÁúÀÌ´Ù!!¶ó´Â ÃÖ±ÙÀÇ Ãß¼¼¸¦ Àû¿ëÇØ º¼ ¶§ ¾µ°÷°ú ¾È¾µ°÷À» Á¤È®È÷ ÆÄ¾ÇÇÏ´Â°Ç º»ÀÎÀÇ ¼±ÅÃÀÔ´Ï´Ù(¹«Ã¥ÀÓÇÏÁÒ?) |
volatileÀ» ¾²´Â°Ô ¾î¶² ºÎºÐÀÌ »ðÁúÀÎÁö ±Ã±ÝÇÕ´Ï´Ù. =) |
|
| À§·Î |
|
 |
Á¶¼º°æ
°¡ÀÔ: 2005³â 12¿ù 13ÀÏ ¿Ã¸° ±Û: 307
|
|
¿Ã·ÁÁü: 2009-03-13 11:25
|
|
| magicpotato ¾¸: |
| volatileÀ» ¾²´Â°Ô ¾î¶² ºÎºÐÀÌ »ðÁúÀÎÁö ±Ã±ÝÇÕ´Ï´Ù. =) |
volatile considered harmful _________________ ´õ ÀÌ»ó ÀÌ °÷¿¡ ¿ÀÁö ¾Ê½À´Ï´Ù. |
|
| À§·Î |
|
 |
park
°¡ÀÔ: 2008³â 7¿ù 30ÀÏ ¿Ã¸° ±Û: 188 ¼Ò¼Ó: bandi
|
|
¿Ã·ÁÁü: 2009-03-13 11:54
|
|
| ºñȸ¿ø ¾¸: |
¿¹¸¦µé¾î ´Ù¸¥ ¾²·¹µå¿¡¼ ¹Ù²Ù´Â ÁßÀÎ 32bit Á¤¼öÀÇ ºñÆ® ÀϺκи¸ ¹Ù²î¾î Àִٰųª ÇÏÁö´Â ¾ÊÁö¿ä. |
À̺κÐÀº Æò¼Ò¿¡ ±Ã±ÝÇÏ´ø »çÇ×Àε¥, Çϵå¿þ¾î¿¡¼ º¸ÀåÀÌ µÇ´Â »çÇ×Àΰ¡¿ä? (ƯÈ÷ ¸ÖƼÄھ¼)
Ȥ½Ã º¸ÀåÀÌ µÈ´Ù¸é, 32ºñÆ®°¡ ¾Æ´Ñ 64ºñÆ® Á¤¼ö¿¡ ´ëÇØ¼µµ º¸ÀåÀÌ µÉ±î¿ä?
Ȥ½Ã ¾Ë°í °è½Ã´ÂºÐ ´äº¯ ºÎʵ右´Ï´Ù. |
|
| À§·Î |
|
 |
ºñȸ¿ø ¼Õ´Ô
|
|
¿Ã·ÁÁü: 2009-03-13 17:25
|
|
http://www.aristeia...Aug_2004_revised.pdf
volatileÀÌ µîÀåÇÏ°Ô µÈ ¹è°æ¿¡ ´ëÇÑ ¼³¸íÀÌ ÀÖÀ¸´Ï Âü°í ÇϽñ¸¿ä..
À§¿Í °°Àº °æ¿ì¿¡´Â memory barrier°¡ ÇÊ¿äÇÑ »óȲÀε¥ C/C++ÀÇ volatileÀº ±×°ÍÀ» Áö¿øÇÏÁö ¸øÇϴµ¥ ¹®Á¦°¡ ÀÖ½À´Ï´Ù.
´Ù½Ã¸»ÇØ C/C++ÀÇ volatileÀº read/write operation¿¡ ´ëÇØ¼ ÃÖÀûȸ¦ ÇÏÁö ¾Ê´Â °ÍÀ̰í .NETÀ̳ª JavaÀÇ volatileÀº C/C++ÀÇ volatile¿¡ reordering±îÁö ¹æÁöÇÏ´Â volatileÀÔ´Ï´Ù. |
|
| À§·Î |
|
 |
magicpotato
°¡ÀÔ: 2003³â 9¿ù 29ÀÏ ¿Ã¸° ±Û: 21
|
|
¿Ã·ÁÁü: 2009-03-13 19:04
|
|
±×³É Áö³ªÄ¡°í ¿À·¡Àü Áö½ÄÀ¸·Î ÄÚµùÇßÀ¸¸é Å«Àϳ¯»· ÇÑ ºÎºÐÀ̳׿ä..
À§¿¡ µÎºÐ ´äº¯ °¨»çÇÕ´Ï´Ù =)
Âü°í·Î ¿µ¾î´Â Àб⠱ÍÂú¾Æ¼ ´Ù½Ã °Ë»öÇߴµ¥ http://skyul.tistory.com/337 ÀÌ°Ô º¸±â ÆíÇϳ׿ä |
|
| À§·Î |
|
 |
ºñȸ¿ø ¼Õ´Ô
|
|
¿Ã·ÁÁü: 2009-03-14 12:09
|
|
| park ¾¸: |
| ºñȸ¿ø ¾¸: |
¿¹¸¦µé¾î ´Ù¸¥ ¾²·¹µå¿¡¼ ¹Ù²Ù´Â ÁßÀÎ 32bit Á¤¼öÀÇ ºñÆ® ÀϺκи¸ ¹Ù²î¾î Àִٰųª ÇÏÁö´Â ¾ÊÁö¿ä. |
À̺κÐÀº Æò¼Ò¿¡ ±Ã±ÝÇÏ´ø »çÇ×Àε¥, Çϵå¿þ¾î¿¡¼ º¸ÀåÀÌ µÇ´Â »çÇ×Àΰ¡¿ä? (ƯÈ÷ ¸ÖƼÄھ¼)
Ȥ½Ã º¸ÀåÀÌ µÈ´Ù¸é, 32ºñÆ®°¡ ¾Æ´Ñ 64ºñÆ® Á¤¼ö¿¡ ´ëÇØ¼µµ º¸ÀåÀÌ µÉ±î¿ä?
Ȥ½Ã ¾Ë°í °è½Ã´ÂºÐ ´äº¯ ºÎʵ右´Ï´Ù. |
Intel? 64 and IA-32 Architectures Software Developer's Manual
Volume 3A: System Programming Guide ÀÇ
7.1.1 Guaranteed Atomic Operations ºÎºÐ¿¡¼ º¸½Ç ¼ö ÀÖ½À´Ï´Ù.  |
|
| À§·Î |
|
 |
park
°¡ÀÔ: 2008³â 7¿ù 30ÀÏ ¿Ã¸° ±Û: 188 ¼Ò¼Ó: bandi
|
|
¿Ã·ÁÁü: 2009-03-14 21:44
|
|
| ºñȸ¿ø ¾¸: |
| park ¾¸: |
| ºñȸ¿ø ¾¸: |
¿¹¸¦µé¾î ´Ù¸¥ ¾²·¹µå¿¡¼ ¹Ù²Ù´Â ÁßÀÎ 32bit Á¤¼öÀÇ ºñÆ® ÀϺκи¸ ¹Ù²î¾î Àִٰųª ÇÏÁö´Â ¾ÊÁö¿ä. |
À̺κÐÀº Æò¼Ò¿¡ ±Ã±ÝÇÏ´ø »çÇ×Àε¥, Çϵå¿þ¾î¿¡¼ º¸ÀåÀÌ µÇ´Â »çÇ×Àΰ¡¿ä? (ƯÈ÷ ¸ÖƼÄھ¼)
Ȥ½Ã º¸ÀåÀÌ µÈ´Ù¸é, 32ºñÆ®°¡ ¾Æ´Ñ 64ºñÆ® Á¤¼ö¿¡ ´ëÇØ¼µµ º¸ÀåÀÌ µÉ±î¿ä?
Ȥ½Ã ¾Ë°í °è½Ã´ÂºÐ ´äº¯ ºÎʵ右´Ï´Ù. |
Intel? 64 and IA-32 Architectures Software Developer's Manual
Volume 3A: System Programming Guide ÀÇ
7.1.1 Guaranteed Atomic Operations ºÎºÐ¿¡¼ º¸½Ç ¼ö ÀÖ½À´Ï´Ù.  |
°¨»çÇÕ´Ï´Ù. ±Ã±ÝÁõÀÌ Ç®·È³×¿ä. Ȥ½Ã ±Ã±ÝÇØ¼ ã¾Æº¸½Ç ºÐµéÀ» À§Çؼ..
7.1.1. Guaranteed Atomic Operations
The Pentium 4, Intel Xeon, P6 family, Pentium, and Intel486 processors guarantee that the
following basic memory operations will always be carried out atomically:
• Reading or writing a byte.
• Reading or writing a word aligned on a 16-bit boundary.
• Reading or writing a doubleword aligned on a 32-bit boundary.
The Pentium 4, Intel Xeon, and P6 family, and Pentium processors guarantee that the following
additional memory operations will always be carried out atomically:
• Reading or writing a quadword aligned on a 64-bit boundary.
• 16-bit accesses to uncached memory locations that fit within a 32-bit data bus.
The P6 family processors guarantee that the following additional memory operation will always
be carried out atomically:
• Unaligned 16-, 32-, and 64-bit accesses to cached memory that fit within a 32-byte cache
line.
Accesses to cacheable memory that are split across bus widths, cache lines, and page boundaries
are not guaranteed to be atomic by the Pentium 4, Intel Xeon, P6 family, Pentium, and Intel486
processors. The Pentium 4, Intel Xeon, and P6 family processors provide bus control signals that
permit external memory subsystems to make split accesses atomic; however, nonaligned data
accesses will seriously impact the performance of the processor and should be avoided. |
|
| À§·Î |
|
 |
Testors

°¡ÀÔ: 2003³â 7¿ù 26ÀÏ ¿Ã¸° ±Û: 557 ¼Ò¼Ó: (ÁÖ)nFlavor
Ÿ »çÀÌÆ® ID(?): 48179650
|
|
¿Ã·ÁÁü: 2009-03-16 11:08
|
|
¸µÅ©ÇØ ÁֽŠ±Û¿¡ ÀÌ·± ³»¿ëÀÌ Àִµ¥¿ä, Á» ÀÌÇØ°¡ ¾È°¡¼ µ¡ºÙÀÔ´Ï´Ù.
| Àοë: |
58 Another situation where one might be tempted to use volatile is
59 when the processor is busy-waiting on the value of a variable. The right
60 way to perform a busy wait is:
61
62 while (my_variable != what_i_want)
63 cpu_relax();
64
65 The cpu_relax() call can lower CPU power consumption or yield to a
66 hyperthreaded twin processor; it also happens to serve as a memory barrier,
67 so, once again, volatile is unnecessary. |
ÀÌ°Ç memory barrier ¿Í´Â »ó°üÀÌ ¾ø´Â ³»¿ëÀÎ°Í °°¾Æ º¸À̴µ¥¿ä... ÄÄÆÄÀÏ·¯°¡ my_variable À» ·¹Áö½ºÅÍ·Î ÃÖÀûÈ ½ÃÄѹö¸®¸é ¿µ¿øÈ÷ cpu_relax() ¸¸ ºÒ¸±°Í °°½À´Ï´Ù. Á¦°¡ º¼¶§´Â ÀÌ°Ç ²À volatile À» ½á¾ß¸¸ ÇÏ´Â ºÎºÐÀ¸·Î º¸À̴µ¥... ¿Ö volatile ÀÌ ºÒÇÊ¿äÇÏ´Ù°í ÁÖÀåÇϰí ÀÖ´ÂÁö ÀÌÇØÇϱâ Èûµé±º¿ä. ½ÇÁ¦·Îµµ Å×½ºÆ®¸¦ ÇØ º¸¾Ò´Âµ¥ volatile ÀÌ ¾øÀ¸¸é ¹®Á¦°¡ ¹ß»ýÇß½À´Ï´Ù. _________________ ÇøÓ/¸ðµ¨·¯/¾Ö´Ï¸ÞÀÌÅÍ ±¸ÇØ¿° **Çö¿ª/º¸Ã濪 º´Æ¯°¡´É** / http://testors.net/ |
|
| À§·Î |
|
 |
Á¶¼º°æ
°¡ÀÔ: 2005³â 12¿ù 13ÀÏ ¿Ã¸° ±Û: 307
|
|
¿Ã·ÁÁü: 2009-03-17 14:44
|
|
| Testors ¾¸: |
¸µÅ©ÇØ ÁֽŠ±Û¿¡ ÀÌ·± ³»¿ëÀÌ Àִµ¥¿ä, Á» ÀÌÇØ°¡ ¾È°¡¼ µ¡ºÙÀÔ´Ï´Ù.
| Àοë: |
58 Another situation where one might be tempted to use volatile is
59 when the processor is busy-waiting on the value of a variable. The right
60 way to perform a busy wait is:
61
62 while (my_variable != what_i_want)
63 cpu_relax();
64
65 The cpu_relax() call can lower CPU power consumption or yield to a
66 hyperthreaded twin processor; it also happens to serve as a memory barrier,
67 so, once again, volatile is unnecessary. |
ÀÌ°Ç memory barrier ¿Í´Â »ó°üÀÌ ¾ø´Â ³»¿ëÀÎ°Í °°¾Æ º¸À̴µ¥¿ä... ÄÄÆÄÀÏ·¯°¡ my_variable À» ·¹Áö½ºÅÍ·Î ÃÖÀûÈ ½ÃÄѹö¸®¸é ¿µ¿øÈ÷ cpu_relax() ¸¸ ºÒ¸±°Í °°½À´Ï´Ù. Á¦°¡ º¼¶§´Â ÀÌ°Ç ²À volatile À» ½á¾ß¸¸ ÇÏ´Â ºÎºÐÀ¸·Î º¸À̴µ¥... ¿Ö volatile ÀÌ ºÒÇÊ¿äÇÏ´Ù°í ÁÖÀåÇϰí ÀÖ´ÂÁö ÀÌÇØÇϱâ Èûµé±º¿ä. ½ÇÁ¦·Îµµ Å×½ºÆ®¸¦ ÇØ º¸¾Ò´Âµ¥ volatile ÀÌ ¾øÀ¸¸é ¹®Á¦°¡ ¹ß»ýÇß½À´Ï´Ù. |
Àú´Â ÀÌ ±ÛÀ» º¼¶§ cpu_relax°¡ memory barrier ¿ªÇÒÀ» ÇØÁÖ´Â ÇÔ¼ö¶ó°í ÀÌÇØÇß½À´Ï´Ù(¹®Àå ÀÚü°¡ ±×·¸ÁÒ). ¸®´ª½ºÂÊ¿¡ ÀÖ´Â ÇÔ¼ö´Â ±×·¸±¸¸¸Çϰí ÀÌÇØ¸¦ ÇѰÅÁÒ.
±×¸®°í my_variableÀÌ ÀÚµ¿º¯¼ö°¡ ¾Æ´Ï¶ó¸é ·¹Áö½ºÅÍ·Î ÃÖÀûȵǴ ÀÏÀº ¾øÀ»°Å¶ó ÆÇ´ÜÀÌ µË´Ï´Ù. ½ÇÁ¦ Å×½ºÆ®Çغ¸½Å Äڵ尡 ±Ã±ÝÇϳ׿ä. cpu_relex ÇÔ¼ö´Â ¾Æ´ÏÁö¸¸ ¾Æ·¡Ã³·³ CCAS ±¸ÇöÇÏ´Â °æ¿ì°¡ ¹®Á¦°¡ µÈÀûµµ ¾ø±¸¿ä. InterlockedExchange°¡ memory barrier¿ªÇÒÀ» ÇÏ´Â Á¡À» »©¸é À§ÀÇ ¿¹¿Í Å©°Ô ´Ù¸£Áö ¾Ê´Ù°í »ý°¢ÇÕ´Ï´Ù.
| ÄÚµå: |
for (;;)
{
if (value == 0 && InterlockedExchange(&value, 1) == 0)
break;
Sleep(0);
}
|
Ãß°¡:
±ÛÀ» ¾²°í ´Ù½Ã Àо´Ï CAS¶ó°í ¾²°í InterlockedExchange¸¦ »ç¿ëÇØ¼ Äڵ带 ½á³ù±º¿ä. InterlockedCompareExchange¿Í °°Àº °á°ú°¡ ³ª¿À´Ï ±×·±°¡º¸´ÙÇÏ°í ºÁÁÖ¼¼¿ä. _________________ ´õ ÀÌ»ó ÀÌ °÷¿¡ ¿ÀÁö ¾Ê½À´Ï´Ù.
Á¶¼º°æ °¡ 2009-03-17 14:58¿¡ ¼öÁ¤ÇÔ, ÃÑ 1 ¹ø ¼öÁ¤µÊ |
|
| À§·Î |
|
 |
Á¶¼º°æ
°¡ÀÔ: 2005³â 12¿ù 13ÀÏ ¿Ã¸° ±Û: 307
|
|
¿Ã·ÁÁü: 2009-03-17 14:53
|
|
| ºñȸ¿ø ¾¸: |
À§¿Í °°Àº °æ¿ì¿¡´Â memory barrier°¡ ÇÊ¿äÇÑ »óȲÀε¥ C/C++ÀÇ volatileÀº ±×°ÍÀ» Áö¿øÇÏÁö ¸øÇϴµ¥ ¹®Á¦°¡ ÀÖ½À´Ï´Ù.
´Ù½Ã¸»ÇØ C/C++ÀÇ volatileÀº read/write operation¿¡ ´ëÇØ¼ ÃÖÀûȸ¦ ÇÏÁö ¾Ê´Â °ÍÀ̰í .NETÀ̳ª JavaÀÇ volatileÀº C/C++ÀÇ volatile¿¡ reordering±îÁö ¹æÁöÇÏ´Â volatileÀÔ´Ï´Ù. |
Á¦Ç°º°·Î ´Ù¸¥ ³»¿ëÀÔ´Ï´Ù. C++¶ó¼ ¾ÈµÇ´Â°Ô ¾Æ´Ï¶ó Á¦Ç° »ç¾çÀ» º¸°í °áÁ¤ÇÒ ³»¿ëÀÔ´Ï´Ù. _________________ ´õ ÀÌ»ó ÀÌ °÷¿¡ ¿ÀÁö ¾Ê½À´Ï´Ù. |
|
| À§·Î |
|
 |
Á¶¼º°æ
°¡ÀÔ: 2005³â 12¿ù 13ÀÏ ¿Ã¸° ±Û: 307
|
|
¿Ã·ÁÁü: 2009-03-17 22:34
|
|
| ºñȸ¿ø ¾¸: |
"InterlockedExchange°¡ memory barrier¿ªÇÒÀ» ÇÏ´Â Á¡"
=> ÀÎÅͶô ÇÔ¼ö¿Í memory barrier´Â ÀüÇô °ü°è°¡ ¾ø½À´Ï´Ù (Á¦°¡ ¾Ë±â·Î). Interlocked* °è¿Àº °á±¹ x86 ¸í·É¾î¿¡ LOCK Á¢µÎ¾î¸¦ ºÙÀÌ´Â °Ì´Ï´Ù. Memory barrier´Â mfence/sfence/lfence·Î µû·Î Á¸ÀçÇÏ´Â ÀüÇô ´Ù¸¥ Á¾·ùÀÇ ¸í·ÉÀÔ´Ï´Ù. ¸Þ¸ð¸® ¹è¸®¾î°¡ ÀÖÀ¸¸é ÇÁ·Î¼¼¼ ÆÄÀÌÇÁ¶óÀÎÀ» Áö±Ý pending µÈ ¸ðµç ¸í·ÉµéÀÌ ¿Ï·áµÉ¶§±îÁö ÁߴܽÃŵ´Ï´Ù. |
Interlocked* ÇÔ¼öµéÀÇ ¼±¾ðÀ» º¸¸é LONG volatile* targetó·³ volatileÀÌ ºÙ¾î ÀÖ½À´Ï´Ù. ¸í·É¿¡ ºÙÀº LOCK ¶§¹®ÀÌ ¾Æ´Ï¶ó Àú volatile ¶§¹®¿¡ memory barrier ¿ªÇÒÀ» ÇϰԵÇÁÒ. volatileÀ» ±âÁØÀ¸·Î ij½¬¶óÀÎÀ» Á¤¸®Çϴϱî¿ä.
Á¦°¡ ¾´ memory barrier¶ó´Â ´Ü¾î´Â _Read(Write)Barrier¿Í µ¿ÀǾî¶ó°í º¸¼Åµµ µË´Ï´Ù. memory barrier°¡ ¸»¾¸ÇϽŠmfence/sfence/lfence¸¸À» ÀǹÌÇÑ´Ù¸é Á¦°¡ ´Ü¾î »ç¿ëÀ» À߸øÇ߳׿ä.
Ãß°¡:
¾²°í º¸´Ï ÀÌ»óÇϳ׿ä. CPU¿¡ ºÐ¸íÈ÷ memory barrier ¸í·É¾î°¡ ÀÖ°ÚÁö¸¸ - ±×°Ô ¸»¾¸ÇϽŠ*fence ¸í·É¾î°ÚÁÒ - _Read(Write)Barrier intrinsic°ú ´Ù¸¥ ¸í·É¾î¶ó°í »ý°¢µÇÁö ¾Ê½À´Ï´Ù. _________________ ´õ ÀÌ»ó ÀÌ °÷¿¡ ¿ÀÁö ¾Ê½À´Ï´Ù. |
|
| À§·Î |
|
 |
Testors

°¡ÀÔ: 2003³â 7¿ù 26ÀÏ ¿Ã¸° ±Û: 557 ¼Ò¼Ó: (ÁÖ)nFlavor
Ÿ »çÀÌÆ® ID(?): 48179650
|
|
¿Ã·ÁÁü: 2009-03-18 01:06
|
|
| Á¶¼º°æ ¾¸: |
| ±×¸®°í my_variableÀÌ ÀÚµ¿º¯¼ö°¡ ¾Æ´Ï¶ó¸é ·¹Áö½ºÅÍ·Î ÃÖÀûȵǴ ÀÏÀº ¾øÀ»°Å¶ó ÆÇ´ÜÀÌ µË´Ï´Ù. ½ÇÁ¦ Å×½ºÆ®Çغ¸½Å Äڵ尡 ±Ã±ÝÇϳ׿ä. |
ÀÚµ¿º¯¼ö·Î Å×½ºÆ® Çß½À´Ï´Ù.
| Á¶¼º°æ ¾¸: |
| Interlocked* ÇÔ¼öµéÀÇ ¼±¾ðÀ» º¸¸é LONG volatile* targetó·³ volatileÀÌ ºÙ¾î ÀÖ½À´Ï´Ù. ¸í·É¿¡ ºÙÀº LOCK ¶§¹®ÀÌ ¾Æ´Ï¶ó Àú volatile ¶§¹®¿¡ memory barrier ¿ªÇÒÀ» ÇϰԵÇÁÒ. volatileÀ» ±âÁØÀ¸·Î ij½¬¶óÀÎÀ» Á¤¸®Çϴϱî¿ä. |
±×·± Àǹ̿´´Ù¸é "volatile Àº »ðÁúÀÌ´Ù" ¶ó´Â ÁÖÀåÀÇ ±Ù°Å°¡ µÉ ¼ö ¾ø½À´Ï´Ù. ¿Ö³ÄÇÏ¸é °á±¹ ¹®Á¦´Â volatile ¿¡ ÀÇÇØ ÇØ°áµÈ °ÍÀÌ°í ´Ù¸¥¸»·Î volatile ÀÌ ²À ÇÊ¿äÇÏ´Ù´Â ÀǹÌÀ̱⠶§¹®ÀÔ´Ï´Ù. Àú¶ó¸é Àú·± °æ¿ì¿¡ volatile À» ²À ¸í½ÃÇØ µÓ´Ï´Ù.
memory barrier °¡ ÀÚ²Ù ¾ð±ÞµÇ´Âµ¥ Àú´Â busy wait ¿¡¼ÀÇ volatile °ú memory barrier °¡ ¾î¶² °ü°è°¡ ÀÖ´ÂÁö Àß ¸ð¸£°Ú½À´Ï´Ù. (ºñȸ¿ø´ÔÀÇ °ßÇØ¿Í µ¿ÀÏÇÕ´Ï´Ù.) ±×¸®°í ÀοëÇϽŠ±Û¿¡ »ç¿ëµÈ busy wait ÄÚµå´Â test and set À» ÀǹÌÇÑ °ÍÀ¸·Î º¸ÀÌÁö ¾Ê½À´Ï´Ù.
Á¦ °ßÇØ´Â ÀÌ·¸½À´Ï´Ù.
1. volatile considered harmful ÀÇ ÀúÀÚ°¡ ¹º°¡¸¦ ¿ÀÇØÇϰí ÀÖ´Ù.
2. ȤÀº ¸®´ª½º Ä¿³Î °³¹ß ȯ°æÀº ¿ì¸®°¡ ¾Ë°í ÀÖ´Â ÀϹÝÀûÀÎ °³¹ß ȯ°æ°ú ±× µ¿ÀÛ¿¡ Â÷À̰¡ ÀÖ´Ù. (°¡·É gcc ÀÇ volatile 󸮰¡ ƯÀÌÇÏ´Ù´øÁö...)
¿©Æ° "volatile Àº »ðÁúÀÌ´Ù." ¶ó´Â ÁÖÀåÀº Á» ¼º±ÞÇѰÍÀÌ ¾Æ´Ñ°¡ ½Í½À´Ï´Ù. _________________ ÇøÓ/¸ðµ¨·¯/¾Ö´Ï¸ÞÀÌÅÍ ±¸ÇØ¿° **Çö¿ª/º¸Ã濪 º´Æ¯°¡´É** / http://testors.net/ |
|
| À§·Î |
|
 |
Á¶¼º°æ
°¡ÀÔ: 2005³â 12¿ù 13ÀÏ ¿Ã¸° ±Û: 307
|
|
¿Ã·ÁÁü: 2009-03-18 09:27
|
|
±ÛÀ» ¾²°í ³ª¼ ¹ã¿¡ °øºÎ¸¦ Á» Çߴµ¥ volatile¿¡ memory barrier¿¡ °ü·ÃµÈ ºÎºÐÀº È®½ÇÈ÷ Á¦°¡ Àß ¸ø ¾Ë°í ÀÖ¾ú½À´Ï´Ù. À§¿¡¼ Á¦°¡ volatile°ú memory barrierÀÇ °ü°è¿¡ ´ëÇØ¼ ¾ê±âÇÑ°Ç À߸øµÈ ¾ê±âÀÔ´Ï´Ù.
³ª¸ÓÁö ºÎºÐµéÀº Á¤¸® Á» ÇØ¼ ´Ù½Ã ±ÛÀ» ¿Ã¸®°Ú½À´Ï´Ù. _________________ ´õ ÀÌ»ó ÀÌ °÷¿¡ ¿ÀÁö ¾Ê½À´Ï´Ù. |
|
| À§·Î |
|
 |
ºñȸ¿ø ¼Õ´Ô
|
|
¿Ã·ÁÁü: 2009-03-19 12:13
|
|
¸ÖƼ¾²·¹µå ȯ°æ¿¡¼ volatileÀ» »ç¿ëÇÏ´Â°Ô »ðÁúÀ̶ó¸é ´ë¾ÈÀÌ µû·Î ÀÖ³ª¿ä?
±×¸®°í ¹®¶à ±Ã±ÝÇØ¼ ±×·±µ¥
while (my_variable != what_i_want) cpu_relax();
¿©±â¼
my_variable °¡ volatile ÀÌ ¾Æ´Ï¶ó¸é
ÇѼ¼¿ù Áö³ª ¾ðÁ¨°¡ cpu ij½¬¶óÀÎÀÌ ¹«È¿ÈµÇ¸é ºüÁ®³ª¿Ã¼ö ÀÖÁö ¾ÊÀ»±î¶õ »ý°¢ÀÌ µå´Âµ¥ ¸Â´ÂÁö ¸ð¸£°Ú³×¿ä.. |
|
| À§·Î |
|
 |
ºñȸ¿ø ¼Õ´Ô
|
|
¿Ã·ÁÁü: 2009-03-19 12:16
|
|
| ºñȸ¿ø ¾¸: |
¸ÖƼ¾²·¹µå ȯ°æ¿¡¼ volatileÀ» »ç¿ëÇÏ´Â°Ô »ðÁúÀ̶ó¸é ´ë¾ÈÀÌ µû·Î ÀÖ³ª¿ä?
±×¸®°í ¹®¶à ±Ã±ÝÇØ¼ ±×·±µ¥
while (my_variable != what_i_want) cpu_relax();
¿©±â¼
my_variable °¡ volatile ÀÌ ¾Æ´Ï¶ó¸é
ÇѼ¼¿ù Áö³ª ¾ðÁ¨°¡ cpu ij½¬¶óÀÎÀÌ ¹«È¿ÈµÇ¸é ºüÁ®³ª¿Ã¼ö ÀÖÁö ¾ÊÀ»±î¶õ »ý°¢ÀÌ µå´Âµ¥ ¸Â´ÂÁö ¸ð¸£°Ú³×¿ä.. |
»ý°¢Çغ¸´Ï volatileÀÌ ¾Æ´Ï¶ó¸é ·¹Áö½ºÅͰªÀÌ ½ºÅÿ¡ Ǫ½ÃÆËµÇ¸é¼ ¿µ¿øÀÌ ¸ø³ª¿Ã°Í °°±º¿ä.. |
|
| À§·Î |
|
 |
ºñȸ¿ø ¼Õ´Ô
|
|
¿Ã·ÁÁü: 2009-03-19 13:27
|
|
__int64 a = 1;
__int64 b = 2;
if(a == b)
printf("haha");
__int64 a = 1;
00401FC8 mov dword ptr [a],1
00401FCF mov dword ptr [ebp-4],0
__int64 b = 2;
00401FD6 mov dword ptr [b],2
00401FDD mov dword ptr [ebp-0Ch],0
if(a == b)
00401FE4 mov eax,dword ptr [a]
00401FE7 cmp eax,dword ptr [b]
00401FEA jne wmain+5Bh (40200Bh)
00401FEC mov ecx,dword ptr [ebp-4]
00401FEF cmp ecx,dword ptr [ebp-0Ch]
00401FF2 jne wmain+5Bh (40200Bh)
printf("haha");
00401FF4 mov esi,esp
00401FF6 push offset ___xi_z+1A8h (4188CCh)
00401FFB call dword ptr [__imp__printf (421604h)]
00402001 add esp,4
00402004 cmp esi,esp
00402006 call _RTC_CheckEsp (40EFB0h)
int a = 1;
int b = 2;
if(a == b)
printf("haha");
int a = 1;
00401FC5 mov dword ptr [a],1
int b = 2;
00401FCC mov dword ptr [b],2
if(a == b)
00401FD3 mov eax,dword ptr [a]
00401FD6 cmp eax,dword ptr [b]
00401FD9 jne wmain+42h (401FF2h)
printf("haha");
00401FDB mov esi,esp
00401FDD push offset ___xi_z+1A8h (4188CCh)
00401FE2 call dword ptr [__imp__printf (421604h)]
00401FE8 add esp,4
00401FEB cmp esi,esp
00401FED call _RTC_CheckEsp (40EFB0h)
x86¿¡¼ int¿Í __int64¸¦ °¡Áö°í ºñ±³¸¦ ¼öÇàÇÏ´Â ÄÚµåÀÔ´Ï´Ù.
__int64ÀÇ °æ¿ì ºñ±³ÇÒ ¶§ »óÀ§4ºñÆ®¿Í ÇÏÀ§4ºñ¸£¸¦ ³ª´²¼ ¼öÇàÇϳ׿ä.
x86¿¡¼ __int64 ºñ±³ÇÒ ¶§´Â
InterlockedexchangeAdd64(&a, 0) == InterlockedexchangeAdd64(&b, 0)
ÀÌ·±½ÄÀ¸·Î ÇØ¾ß µÇÁö ¾ÊÀ»±î¿ä? |
|
| À§·Î |
|
 |
ºñȸ¿ø ¼Õ´Ô
|
|
¿Ã·ÁÁü: 2009-03-21 20:27
|
|
| º¸Åë 32ºñÆ® ¸Ó½Å(ȤÀº 32ºñÆ® ȣȯ ¸ðµå)¿¡¼´Â 64ºñÆ® º¯¼öµéÀº Àб⵵ ¿øÀÚ¼ºÀÌ º¸Àå ¾È µÇÁö ¾Ê³ª¿ä? ¿¹Àü¿¡ À§¿¡ ºñȸ¿ø´ÔÀÌ ¿Ã¸° ¾î¼Àºí¸® ÄÚµå¿Í ºñ½ÁÇÑ »óȲ ¶§¹®¿¡ Àá±ñ °ñ ¶§·È´ø ±â¾ïÀÌ ÀÖ¾ú´Âµ¥... Ȥ½Ã À߸ø ¾Ë°í ÀÖ´ø°Å¶ó¸é ÁöÀû¹Ù¶ø´Ï´Ù. |
|
| À§·Î |
|
 |
|