C#

volatile

doublerabbits 2023. 9. 8. 10:49

최적화

  • 캐싱(CPU 가 메모리에서 변수를 읽어서 레지스트리에 저장)된 변수에 대해서는 CPU 가 메모리 접근(Read)을 하지 않도록 한다.
  • 이는 멀티태스킹 환경에서 의도하지 않은 상황을 발생시킨다.

A 스레드에 캐시된 변수가 있는 상황에서

B 스레드가 해당 변수를 변경(Write) 할때

A 가 캐시된 변수의 값을 사용하면 오류 발생

A 가 정확한 값을 메모리에서 다시 읽어오는 과정이 필요하다.

 

volatile 로 지정된 변수는 최적화를 수행하지 않는다.

  • 필드 변수에만 적용 가능
  • 지역 변수는 volatile 선언 불가
  • 일부 항목에 대해서는 atomic 한 연산(read-modify-write)을 수행하지만, 모두 지원되지는 않음(다중 스레드 안전성은 Interlocked, lock 등을 사용해야 함)