반응형 서버11 ReaderWriterLock 구현 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Systehttp://m.Threading.Tasks;namespace SeverCore { //재귀적 락을 허용할지 (NO) WriteLock->WriteLock Ok, WriteLock->ReadLock OK, ReadLock ->WriteLock NO //스핀락 정책(5000번 ->Yield internal class Lock { const int EMPTY_FLAG = 0x00000000; const int WRITE_MASK = 0x7FFF0000; const i.. 2024. 8. 6. ReaderWriterLock using System; using System.Threading; using Systehttp://m.Threading.Tasks;namespace ServerCore { class Program { //1.근성 //2.양보 //3.갑질 //Monitor static object _lock = new object(); static SpinLock _lock2 = new SpinLock(); static Mutex _lock3 = new Mutex();//무겁고 느리다 //RWLock ReaderWriteLock static ReaderWriterLockSlim .. 2024. 8. 6. AutoResetEvent using System; using System.Threading; using Systehttp://m.Threading.Tasks;namespace ServerCore { class Lock { //bool AutoResetEvent _available = new AutoResetEvent(true); //ManualResetEvent _available = new ManualResetEvent(true); public void Acquire() { _available.WaitOne();//입장 시도 //_available.Reset(); //bool =false;문을 닫는.. 2024. 8. 6. Context Switching using System; using System.Threading; using Systehttp://m.Threading.Tasks;namespace ServerCore { class SpinLock { volatile int _locked = 0; public void Acquire() { int expected = 0; int desired = 1; while (true) { /*int original = Interlocked.Exchange(ref _locked, 1); if (original ==.. 2024. 8. 6. SpinLock using System; using System.Threading; using Systehttp://m.Threading.Tasks;namespace ServerCore { class SpinLock { bool _locked = false; public void Acquire() { while(_locked) { //잠김이 풀리기를 기다린다. } _locked = true; } public void Release() { _locked = false; } .. 2024. 7. 30. DeadLock namespace SeverCore { class SessionManager { static object _lock = new object(); public static void TestSession() { lock (_lock) { } } public static void Test() { lock(_lock) { UserManager.TestUser(); } } } class UserManager { .. 2024. 7. 30. Lock 기초 namespace SeverCore { internal class Program { static int number = 0; static object _obj = new object(); static void Thread_1() { for (int i = 0; i { //상호 배제 Mutual Exclusive Monitor.Enter(_obj);//문을 잠구는 행위 number++; Monitor.Exit(_obj);//잠금 해제 } } .. 2024. 7. 30. 메모리 배리어 namespace SeverCore { internal class Program { //메모리 배리어 //A)코드 재배치 억제 //B) 가시설 //1) Full Memory Barrier (ASM MFENCE, C$ Thread.MemoryBarrier) : Store/ Load 둘 다 막는다 //2) Store Memory Barrier(ASM SFENCE) : Store만 막는다 //3) Load Memory Barrier( ASM LFENCE) : Load만 막는다 static int x = 0; static int y = 0; static.. 2024. 7. 26. 디버그 최적화 namespace SeverCore { internal class Program { volatile static bool _stop = false; static void ThreadMain() { Console.WriteLine("쓰레드 시작"); while (!_stop) { //누군가 stop 신호를 해주기 기다린다 } Console.WriteLine("쓰레드 종료"); } static void Main(string[] args) { Task t .. 2024. 7. 26. 캐시 1) TEMPORAL LOCALITY시간적으로 보면, 방금 주문한 테이블에서 추가 주문이 나올 확률이 높다.방금 주문한걸 메모해 놓으면 편하지 않을까?2) SPACIAL LOCALITY공간적으로 보면, 방금 주문한 사람 근처에 있는 사람이 추가 주문을 할 확률이 높다. 방금 주문한 사람과 합석하고 있는 사람들의 주문 목록도 메모해 놓으면 편하지 않을까? 2024. 7. 26. 멀티쓰레드 Thread t = new Thread(MainThred);//쓰레드 생성 t.Name = "Test Thread";//쓰레드 이름 지정 t.IsBackground = true;//백그라운드 t.Start();//쓰레드 시작 t.Join();//쓰레드가 끝날때 까지 기다린다 ThreadPool.QueueUserWorkItem(MainThred);//백그라운드로 돌아가는 쓰레드 ThreadPool.SetMinThreads(1, 1);//최소 쓰레드 갯수 ThreadPool.SetMaxThreads(5, 5);//최대 쓰레드 갯수for (int i = 0; i { ThreadPool.QueueUserWorkItem((obj) => { while (true) { } }); } ThreadPool.. 2024. 7. 26. 이전 1 다음 반응형