C# Rookiss Part4 ๊ฒ์์๋ฒ : ThreadLocalStorage
๐โโ๏ธTLS
- ์ ์ญ๋ณ์์ธ๋ฐ ์ฐ๋ ๋๋ง๋ค ๊ณ ์ ํ๊ฒ ์ ๊ทผํ ์์๋ ์ ์ญ๋ณ์
- ์ง์์๊ฒ ํ๊บผ๋ฒ์ ์ผ์ํค๊ธฐ (ํฐ ์๋ฐ์ ๋ฐ์ฐฌ, ๋ฉ์ธ ๋ฉ๋ด ๋ฑ๋ฑ์ ์ฌ๋ ค์ ์๋น)
- ์คํ์ ๋ฃ๊ณ ์ถ์ง๋ง ์คํ์ ๋ถ์์ ํจ
- TLS๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉ!!
๐ชTLS
class Program
{
static ThreadLocal<string> ThreadName = new ThreadLocal<string>();
static void WhoAmI()
{
ThreadName.Value = $"ThreadName is {Thread.CurrentThread.ManagedThreadId}";
Thread.Sleep(100);
Console.WriteLine(ThreadName.Value);
}
static void Main(string[] args)
{
// ThreadLocalStorage
// ์ ์ญ๋ณ์์ธ๋ฐ ์ฐ๋ ๋๋ง๋ค ๊ณ ์ ํ๊ฒ ์ ๊ทผํ ์์๋ ์ ์ญ๋ณ์
Parallel.Invoke(WhoAmI, WhoAmI, WhoAmI, WhoAmI, WhoAmI, WhoAmI);
}
}
Parallel.Invoke() ์์ ๋ค์ด๊ฐ Action๋งํผ ํ ์คํฌ๋ฅผ ๋ง๋ค์ด ์คํ ์์ผ์ค ์ฐ๋ ๋ ํ์์ ๋ง๋ค์ด์ง
- ๋ฌธ์ ์
- ์ผ๊พผ์ด ์ผํ๋ฌ ๊ฐ๋ค์ค๋ฉด ๊ฐ์ ๋ฎ์ด์จ์ ๋ค์ ์ผํจ
๐ชTLS repeat
class Program
{
static ThreadLocal<string> ThreadName = new ThreadLocal<string>(() => { return $"ThreadName is {Thread.CurrentThread.ManagedThreadId}"; });
static void WhoAmI()
{
bool repeat = ThreadName.IsValueCreated;
if (repeat)
Console.WriteLine(ThreadName.Value + " (repeat)");
else
Console.WriteLine(ThreadName.Value);
}
static void Main(string[] args)
{
ThreadPool.SetMinThreads(1, 1);
ThreadPool.SetMaxThreads(3, 3);
Parallel.Invoke(WhoAmI, WhoAmI, WhoAmI, WhoAmI, WhoAmI, WhoAmI);
}
}
repeat์ด false๋ฉด else๋ก ๋น ์ง๋๋ฐ null๊ฐ์ ๋ฐํํจ
null์ธ ์ํ๋ผ๋ฉด () => { return $"ThreadName is {Thread.CurrentThread.ManagedThreadId}"; }
์ด ์คํ๋จ
์ฆ, () => { return $"ThreadName is {Thread.CurrentThread.ManagedThreadId}"; }
์ด ๊ณ์ ์ฌ์ฉ ๋๋๊ฒ์ด ์๋๋ผ ๊ฐ์ด ์์ ๋๋ง ์ฌ์ฉ๋๊ณ
๊ฐ์ด ์์ผ๋ฉด ํจ์๋ ๋ฐ๋ ์ํจ