320x100
728x90
스레드에 이어서...
다음과 같이 스레드를 작성하고
debug 모드로 실행하면 정상적으로 실행되는 것을 볼 수 있다.
using System;
using System.Threading;
using System.Threading.Tasks;
namespace ServerCore
{
class Program
{
static bool _stop = false; //모든 스레드가 동시에 접근함
static void ThreadMain()
{
Console.WriteLine("쓰레드 시작!"); //단축키 : cw를 치고 tab 두번 누르기
while(_stop == false)
{
//누군가가 stop 신호를 해주기를 기다림
}
Console.WriteLine("쓰레드 종료!");
}
static void Main(string[] args)
{
Task t = new Task(ThreadMain);
t.Start();
Thread.Sleep(1000); //1초 동안 대기
_stop = true;
Console.WriteLine("Stop 호출");
Console.WriteLine("종료 대기중");
t.Wait(); //스레드가 종료 되었는 지 확인 (thread 사용 시에는 Join 사용, Task 사용 시에는 wait 사용)
Console.WriteLine("종료 성공");
}
}
}
debug 모드를 release 모드로 변경하면 최적화가 진행된다.
release 모드로 변경하고 다시 디버깅을 하면
위와 같이 종료 대기중에 멈춰 있는 것을 볼 수 있다.
Wait()에서 돌아오지 않고 스레드메인의 무한 루프를 돌고 있을 것이다...
이처럼 멀티 스레드를 만들 때, release 모드로 최적화 하면 debug에서는 되는 것이
안되는 경우가 발생할 수 있다.
왜냐..
스레드 안의 while문을 다음과 같은 로직으로 받아들이기 때문이다.
if(_stop == false)
{
while (true)
{
}
}
이 때, volatile을 함께 선언해주면 최적화 되는 것을 막을 수 있다.
다음과 같이 정상적으로 실행된다...
(하지만 사용 추천하지 않음)
출처 : https://www.inflearn.com/course/%EC%9C%A0%EB%8B%88%ED%8B%B0-mmorpg-%EA%B0%9C%EB%B0%9C-part4
728x90
반응형
'게임 서버 > Thread' 카테고리의 다른 글
[c#/유니티] DeadLock과 SpinLock에 대해 (0) | 2022.12.08 |
---|---|
[c#/유니티] 임계영역(Critical Section)을 위한 Monitor와 Lock (0) | 2022.12.07 |
[c#/유니티] Interlocked에 대해 (2) | 2022.12.07 |
[c#/유니티] 캐시(Cache) 이론과 메모리 배리어(Memory Barrier) (2) | 2022.12.06 |
[c#/유니티] 스레드(Thread)와 스레드풀(ThreadPool) (0) | 2022.12.05 |