디버그 모드에서는 아무 문제가 없던 이 코드가,
namespace ServerCore;
internal class Program
{
private static bool _stop = false; // 전역으로 선언된 변수는 모든 스레드에서 접근 가능. 아래 Main과 ThreadMain에서 접근
private static void ThreadMain()
{
Console.WriteLine("ThreadMain: Start");
while (!_stop)
{
// 누군가가 _stop을 true로 만들 때까지 아무것도 하지 않고 대기
}
Console.WriteLine("ThreadMain: Stop");
}
private static void Main(string[] args)
{
var t = new Task(ThreadMain);
t.Start();
Thread.Sleep(1000);
_stop = true;
Console.WriteLine("Main: Stop");
t.Wait(); // thread의 join과 같은 역할
Console.WriteLine("Main: End");
}
}
릴리즈 모드에서는 무한 루프에 빠지게 되는 현상이 있을 수 있다. 왜냐하면 컴파일러 최적화 때문인데,
if (_stop != false)
{
while (true)
{
// Infinite loop
}
}
처럼 처리될 수 있다는 것.
해결에 필요한 동기화 메커니즘(Interlocked, CancellationToken, ManualResetEvent 등)은 차차 알아보자.
'공부 > 게임서버' 카테고리의 다른 글
컨텍스트 스위칭 (0) | 2024.11.10 |
---|---|
교착 상태 (Deadlock) (1) | 2024.11.09 |
Interlocked 사용 시 그 반환값을 사용하자 (0) | 2024.11.09 |
하드웨어 최적화 문제 / 메모리 배리어 (3) | 2024.11.09 |
TaskCreationOptions.LongRunning 사용법과 주의사항 (0) | 2024.11.09 |