📄 volatile
최적화 등 컴파일러의 재량을 제한하는 역할을 한다. 개발자가 설정한 개념을 구현하기 위해 코딩된 프로그램을 온전히 컴파일되도록 한다. 주로 최적화와 관련하여 volatile가 선언된 변수는 최적화에서 제외된다.
volatile는 멀티스레드 환경에서 컴파일러의 최적화로 인해 개발자가 의도한 코드가 바뀌어 비 정상적으로 작동하는것을 방지하기위해 해당 변수에 컴파일러 최적화를 제한(제외)하는 키워드입니다.
디버그 환경에서는 릴리즈와 다르게 컴파일러최적화가 많이 일어나지 않기때문에 개발을하며 디버그하는데 발견할 수 없지만, 릴리즈 환경에서는 컴파일러 최적화로 인해 예측하지 못한 오류가 발생할 수 있습니다.
📄 예시
namespace ServerCore
{
class Program
{
static bool _stop = false; //정적필드는 모든 스레드가 동시에 접근 가능
static void SubThread()
{
Console.WriteLine("스레드 시작");
while (_stop == false) { /*다른 스레드에서 _stop을 true로 바꿔주기를 기다린다..*/ }
Console.WriteLine("스레드 종료");
}
static void Main(string[] args)
{
Task t = new Task(SubThread);
t.Start();
//메인스레드 1초간 슬립
Thread.Sleep(1000);
{
Console.WriteLine("Stop 호출");
_stop = true;
Console.WriteLine("종료 대기중");
}
//t Task가 종료될때까지 대기
t.Wait();
Console.WriteLine("종료 성공");
}
}
}
- Release 환경에서 프로그램 실행
- Debug환경에서 프로그램 실행
volatile static bool _stop = false; //정적필드는 모든 스레드가 동시에 접근 가능
- volatile 변수 선언을 하여 컴파일러 최적화를 막습니다.
- Release 환경에서 프로그램 실행
'server > socket server' 카테고리의 다른 글
[C# 서버] Context Switching (0) | 2023.01.04 |
---|---|
[C# 서버] 스핀락 (0) | 2023.01.04 |
[C# 서버] 원자성, Interlocked, Monitor, lock (0) | 2023.01.02 |
[C# 서버] 메모리 배리어 (0) | 2023.01.02 |
[C# 서버] 멀티스레드(Multi-thread) 기초 (0) | 2022.12.30 |