C# Rookiss Part4 ๊ฒ์์๋ฒ : ReaderWriterLock
๐โโ๏ธReaderWriterLock
- ์ฝ์๋(get)๋ ๋ฝ์ด ์๋ ๊ฒ์ฒ๋ผ ์ฌ์ฉํ ์ ์์ง๋ง ์ธ๋๋ ๋ฝ์ ๊ฑธ์ด์ ์ฌ์ฉํ๋ ๊ฒ
- ReaderWriterLockSlim์ด ์ต์ ๋ฒ์ !!
- ๋๋ถ๋ถ ๋ฝ์ด ํ์์์ง๋ง ์ ์ ํ๋ฅ ๋ก ๋ฝ์ด ํ์ํ ๋ ์ฌ์ฉํ๋ค
๐ชLock, SpinLock
- ๋ฝ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ
- ๊ทผ์ฑ(์คํ๋ฝ)
- ์๋ณด(yield)
- ๊ฐ์ง(์ด๋ฒคํธ ๋ฐฉ์)
์ํธ๋ฐฐ์ ์
static Object _lock = new object();
static SpinLock _lock2 = new SpinLock(); // ๋๋ฌด ์ค๋๊ฑธ๋ฆฌ๋ฉด ์๋ณดํจ
static void Main(string[] args)
{
lock (_lock)
{
}
bool lockTacken = false; // ์คํ๋ฝ์ ๋ถ๊ฐ์ ํค๊ฐ ํ์ํจ
try
{
_lock2.Enter(ref lockTacken);
}
finally
{
if (lockTacken)
_lock2.Exit();
}
}
๋ฝ์ ๋ด๋ถ์ ์ผ๋ก Monitor๋ก ๊ตฌํ๋จ
์ผ๋ฐ์ ์ธ๊ฒฝ์ฐ ๊ทธ๋ฅ lock()์ ์ฌ์ฉํ๋ฉด ๋ ๊ฑฐ๊ฐ์ - ํธํด๋ณด์
์คํ๋ฝ์ boolํค๊ฐ ํ์ํ๊ณ try, finally๋ก ๋ค์ด๊ฐ๊ณ ๋๊ฐ์ผ ๋จ
๐ชReaderWriterLock์์
// RWLock ReaderWriterLock
// Getํ ๋๋ lock์ ๊ฑธ์ง ์๊ณ , Writeํ ๋๋ lock์ ๊ฑฐ๋ Lock
static ReaderWriterLockSlim _lock3 = new ReaderWriterLockSlim();
class Reward
{
}
static Reward GetRewardById(int id)
{
_lock3.EnterReadLock();
_lock3.ExitReadLock();
return null;
}
static void AddReward(Reward reward)
{
_lock3.EnterWriteLock();
_lock3.ExitWriteLock();
}
์ฝ์ ๋ ํธํ๊ฒ ์ฝ์ง๋ง ์ธ๋ ์ฐจ๋ก๋ฅผ ์งํค์์ค.