2022년 3월 3일 목요일

[c# 컴파일러 최적화]

 using System;

using System.Threading;
using System.Threading.Tasks;

namespace ServerCore
{

    /// 컴파일러 최적화
    /// 1.스레드는 각자 할당된 스택메모리는 각자 할당받은 스택메모리를 사용한다.
    /// 2.전역으로 선언된 변수는 모든 스레드가 공통으로 사용한다. ex) _stop변수



    ///결론
    ///Release모드에서는 코드 최적화가 일어나서 Debug모드와 다르게 실행이 안될수도있다!

    class Program
    {
        ///static bool _stop = false;/// Release모드하면 최적화의 희생양이됨
       
        volatile static bool _stop = false; /// 최적화에 포함시키지 않기 위해서는 volatile이라고 선언해주어야한다.
        ///하지만 volatile 은 그냥 사용하지 않는게 좋고 lock이나 다른거를 사용해야한다~~


        static void ThreadMain()
        {
            Console.WriteLine("쓰레드 시작!");


            ///이코드는 Release에서 에러남


            ///Realese에서의 작동방식
            ///무한 뺑뺑이가 되는 구조가 되어버렷다
            /*if (_stop == false)
            {
                while (true)
                {

                }
            }*/
            ///Realese에서의 작동방식

            while (_stop == false)
            {
                ///누군가가 stop 신호를 해주기를 기다린다.
            }


            ///컴퓨터의 생각방식


            Console.WriteLine("쓰레드 종료!");
        }
       


        static void Main(string[] args)
        {
            Task t = new Task(ThreadMain);
            t.Start();

            Thread.Sleep(1000);///1초 대기 ///1초뒤에 스레드 종료되게 만들기위해!

            _stop = true;

            Console.WriteLine("Stop 호출");
            Console.WriteLine("종료 대기중");
            t.Wait();
            Console.WriteLine("종료 성공");
        }
    }
}

댓글 없음:

댓글 쓰기

git rejected error(feat. cherry-pick)

 문제 아무 생각 없이 pull을 받지않고 로컬에서 작업! 커밋, 푸시 진행을 해버렷다. push에선 remote와 다르니 당연히 pull을 진행해라고 하지만 로컬에서 작업한 내용을 백업하지 않고 진행하기에는 부담스럽다(로컬작업 유실 가능성) 해결하려...