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;문을 닫는다
}
public void Release()
{
_available.Set();//flag = true;문을 열어준다
}
}
class Program
{
static int _num = 0;
static Lock _lock = new Lock();
static void Thread_1()
{
for(int i = 0; i < 10000; i++)
{
_lock.Acquire();
_num++;
_lock.Release();
}
}
static void Thread_2()
{
for (int i = 0; i < 10000; i++)
{
_lock.Acquire();
_num--;
_lock.Release();
}
}
static void Main(string[] args)
{
Task t1 = new Task(Thread_1);
Task t2 = new Task(Thread_2);
t1.Start();
t2.Start();
Task.WaitAll(t1, t2);
Console.WriteLine(_num);
}
}
}
using System;
using System.Threading;
using Systehttp://m.Threading.Tasks;
namespace ServerCore
{
class Program
{
static int _num = 0;
static Mutex _lock = new Mutex();
static void Thread_1()
{
for (int i = 0; i < 1000000; i++)
{
_lock.WaitOne();
_num++;
_lock.ReleaseMutex();
}
}
static void Thread_2()
{
for (int i = 0; i < 1000000; i++)
{
_lock.WaitOne();
_num--;
_lock.ReleaseMutex();
}
}
static void Main(string[] args)
{
Task t1 = new Task(Thread_1);
Task t2 = new Task(Thread_2);
t1.Start();
t2.Start();
Task.WaitAll(t1, t2);
Console.WriteLine(_num);
}
}
}
'서버' 카테고리의 다른 글
ReaderWriterLock 구현 (0) | 2024.08.06 |
---|---|
ReaderWriterLock (0) | 2024.08.06 |
Context Switching (0) | 2024.08.06 |
SpinLock (0) | 2024.07.30 |
DeadLock (0) | 2024.07.30 |