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();
}
}
}
댓글 없음:
댓글 쓰기