C# volatile 키워드란?
C#에서 volatile 키워드는 멀티스레드 환경에서 발생할 수 있는 동시성(concurrency) 문제를 줄이기 위해 사용됩니다. 여러 스레드가 동시에 같은 변수에 접근하면, 컴파일러나 CPU의 최적화 과정 때문에 한 스레드에서 수정한 값이 다른 스레드에 즉시 반영되지 않을 수 있습니다. volatile 키워드를 붙이면 해당 변수를 항상 메인 메모리에서 직접 읽고 쓰도록 강제하여 이러한 불일치를 예방할 수 있습니다.
volatile 키워드 기본 사용법
public 변수에 volatile 키워드를 적용하는 기본적인 방법은 다음과 같습니다.
class Program {
public volatile int a;
public Program(int _a) {
a = _a;
}
}
위 코드처럼 필드 선언 앞에 volatile을 붙이기만 하면 되며, 별도의 복잡한 설정은 필요하지 않습니다.
정적 변수에 volatile 적용하기
이번에는 두 개의 정적(static) 변수를 선언하고, 새로운 메서드 안에서 값을 설정하는 예제를 살펴보겠습니다.
_out = "Welcome!"; _new = true;
volatile 키워드를 사용하기 전에, 먼저 두 변수를 static으로 선언합니다. 이때 문자열 변수 _out은 일반 static으로, 불리언 변수 _new는 volatile을 함께 지정합니다.
static string _out; static volatile bool _new;
별도 스레드에서 메서드 실행하기
volatile 변수를 다루는 메서드는 별도의 스레드에서 실행하여 멀티스레드 상황을 시뮬레이션할 수 있습니다.
new Thread(new ThreadStart(volatileFunc)).Start();
volatile 변수 값 읽기
마지막으로 volatile로 선언된 변수의 값을 읽어 조건에 따라 출력하는 코드입니다.
if (_new) {
Console.WriteLine(_out);
}
_new가 volatile로 선언되어 있기 때문에, 다른 스레드에서 true로 변경된 값이 이 코드에서 확실하게 읽히게 됩니다.
volatile 키워드의 핵심 특징
- 가시성(Visibility) 보장: 한 스레드에서 변경한 값이 다른 스레드에서 즉시 확인됩니다.
- 명령 재배열 방지: 컴파일러와 CPU가 volatile 변수와 관련된 연산 순서를 임의로 바꾸지 않습니다.
- 원자성은 미보장: volatile은 단순 읽기·쓰기의 원자성까지는 보장하지 않으므로, 카운터 증감 연산 등에는 Interlocked 클래스 사용이 권장됩니다.
마무리
volatile 키워드는 간단한 플래그(flag) 변수나 상태 표시 용도로 매우 유용합니다. 다만 복잡한 동기화가 필요한 경우에는 lock 문이나 Interlocked 클래스 등 더 강력한 도구를 함께 고려하는 것이 좋습니다. 멀티스레드 프로그래밍에서 데이터 일관성 문제로 골머리를 앓고 있다면, volatile 키워드부터 적극적으로 활용해 보시기 바랍니다.