void ThreadFunction1()

{

   g_x = 1;

g_ya = g_y;

}

위 함수 ThreadFunction1()를 수행할 때

g_x = 1; 이 실행 되고

g_ya = S_y; 가 실행될 것이라고 생각하지만 컴파일러 및 프로세서 최적화에 의해서

이 순서가 바뀌어

g_ya = g_y; 가 먼저 실행 되고

g_x = 1; 이 실행될 수 있습니다.

 

이렇게 순서가 바뀌면 멀티 스레드 프로그래밍(CPU Core가 2개 이상 일때)에서는 프로그래머가 생각하지 못한 버그가 발생할 수 있습니다.

 

 

이것을 막기 위한 가장 간단한 방법은 컴파일러나 프로세서 최적화에 의하여 순서가 서로 바뀌지 않게 합니다. 이때 MemoryBarrier을 사용합니다.

 

void ThreadFunction1()

{

   g_x = 1;

   MemoryBarrier()

g_ya = g_y;

}

 

MemoryBarrier는 일종의 벽으로 벽의 위 아래가 서로 바뀌지 않게 해 줍니다.

 

MemoryBarrier를 사용하기 위해서 .NET에서는 System.Threading.Thread.MemoryBarrier();를 사용하고, C++에서는 MemoryBarrier 매크로를 사용합니다.

(MemoryBarrier 매크로는 Windows Vista, Windows Server 2003, Windows Server 2008에서 사용 가능합니다)

 

 

참고 출처 : MSDN 매거진 http://msdn.microsoft.com/ko-kr/magazine/cc817398.aspx

 

신고
by 흥배 2009.03.22 02:50
| 1 |

티스토리 툴바