반응형
쓰레드를 사용할 떄 스택 메모리는 다 각자 자기만의 메모리 할당
전역 변수는 모든 쓰레들이 공통적으로 사용해서 동시 접근 가능하다.
class Program
{
static bool _stop = false;
static void ThreadMain()
{
Console.WriteLine("쓰레드 시작");
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();
Console.WriteLine("종료 성공");
}
}
Release
게임을 릴리즈 할 때는 Debug가 아니라 Release를 사용하는데 온갖 최적화가 들어가서 프로그램이 빨라진다. 최적화를 많이 한다는 것은 프로그램을 만들 때 디버깅을 하기가 어려워 진다는 말이다. 그러므로 여러 버그들이 생겨날 수 있다. 브레이크 포인트를 잡아놔도 안걸릴 수 있다.
컴파일러 입장에서 기계어로 번역되면서 어떠한 점이 바뀌었는지 우리를 위해서 최적화를 해줬는데 멀티쓰레드인 것을 인지하지 못한다.
while(_stop == false)
{
// 누군가가 stop 신호를 해주기를 기다린다.
}
_stop == false만 봤을때 _stop값이 바뀌지 않으니까 _stop을 조건문으로 빼온 것이다. 로직은 똑같다.
if(_stop == false)
{
while(true)
{
}
}
최적화를 안하게 하는 방법
volatile
휘발성 데이터 - 언제 변할지 모르니까 최적화 하지 말아줘
volatile static bool _stop = false;
정상 출력 되는 것을 확인
참고 : 본 내용은 MMORPG PART4 강의를 수강하여 작성하였습니다.
https://www.inflearn.com/course/%EC%9C%A0%EB%8B%88%ED%8B%B0-mmorpg-%EA%B0%9C%EB%B0%9C-part4
반응형
'cs공부 > 운영체제' 카테고리의 다른 글
운영체제 - 쓰레드(Thread), 기아상태,쓰레드풀(Thread Pool) (0) | 2023.04.28 |
---|---|
운영체제 - 문맥교환(Context switching), 프로세스의 상태 (0) | 2023.04.28 |
운영체제 - 프로세스(Process) (0) | 2023.04.28 |
C# - 운영체제 쓰레드 코드(ThreadPool, Task 등) (0) | 2023.04.27 |
운영체제 - 메모리 배리어(MemoryBarrier) (0) | 2023.04.27 |
댓글