2022년 3월 9일 수요일

[c# TLS]

 using System;

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



/// <summary>
/// TLS 구현
/// 응용사례
/// 일거리가 아주 많이 큐에 저장되어있을때 하나씩만 꺼내서 쓰는게 아니라
/// 한 100개씩 한 뭉텅어리를 뽑아와서 자기만의 공간에 넣어둔다음에
/// TLS에서 사용하는것은 굳이 Lock을 걸지않아도 부담없이 사용가능하다(다른thread라면) 다른Thread는 접근할수없는 공간이니 Lock 자체가 필요없다.
///
/// 결과적으로 공용공간에 접근횟수를 줄일 수 있다.
///
///
/// ex) static [JobQueue] 가 있을때 동시다발적으로 접근이 힘듬( Lock을 해줘야해서)
///
///
/// 뿐만아니라 매우 다양하게 사용됨!( 스레드 전역변수 사용할 때 사용하면 됨!)
/// </summary>

namespace ServerCore
{
    class Program
    {

        ///static string ThreadName;/// 전역으로 사용해서 다른곳에서 변경 할 때 문제가 생길 수 있음

        //static ThreadLocal<string>  ThreadName=new ThreadLocal<string>();/// 스레드마다 접근으로 변경
                                                                         ///전역변수는 전역변수인데 스레드마다 고유한 공간이 생김!
                                                                         ///



        static ThreadLocal<string> ThreadName = new ThreadLocal<string>(()=> { return $"My Name Is {Thread.CurrentThread.ManagedThreadId}";  });/// 만약 생성이 안됫다면 (Value 가 null이라면)
                                                                                                                                                ///$"My Name Is {Thread.CurrentThread.ManagedThreadId}" 이걸로 생성함

        static void WhoAmI()
        {

            bool repeat = ThreadName.IsValueCreated; ///한번도 만든적이 없다면 false로 return
            if(repeat)
                Console.WriteLine(ThreadName.Value + "(repeat)");
            else
                Console.WriteLine(ThreadName.Value);
            //ThreadName.Value = $"My Name Is {Thread.CurrentThread.ManagedThreadId}";///자신의 스레드 영역에서만 이름을 바꾼 상태

            //Thread.Sleep(1000); ///1초동안 시간을 줘서 다른곳에서 고친게 내 스레드에 적용되는지 확인


        }

        static void Main(string[] args)
        {

            ThreadPool.SetMinThreads(1, 1);
            ThreadPool.SetMaxThreads(3, 3);

            Parallel.Invoke(WhoAmI, WhoAmI, WhoAmI, WhoAmI, WhoAmI, WhoAmI, WhoAmI);
            ThreadName.Dispose();
        }
    }
}

댓글 없음:

댓글 쓰기

git rejected error(feat. cherry-pick)

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