작성
·
30
0
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ServerCore
{
class SpinLock
{
volatile int _locked = 0; // true: 잠겨있음, false: 잠겨있지 않음
public void Acquire()
{
while(true)
{
////Interlocked.Exchange의 반환값은 원래값이다.
//int original = Interlocked.Exchange(ref _locked, 1);
////original == 0이면 잠금 성공, original == 1이면 잠금 실패
//if (original == 0)
//{
// //내꺼
// break;
//}
//CAS (Compare-And-Swap) 함수라고 한다.
int expected = 0;
int desired = 1;
if(Interlocked.CompareExchange(ref _locked, desired, expected) == expected)
{
break;
}
}
}
public void Release()
{
//잠김을 푼다.
_locked = 0;
}
}
class Program
{
static int _num = 0;
static SpinLock _lock = new SpinLock();
static void Thread_1()
{
for (int i = 0; i < 1000000; i++)
{
_lock.Acquire();
_num++;
_lock.Release();
}
}
static void Thread_2()
{
for (int i = 0; i < 1000000; i++)
{
_lock.Acquire();
_num--;
_lock.Release();
}
}
static void Main(string[] args)
{
Task task = new Task(Thread_1);
Task task2 = new Task(Thread_2);
task.Start();
task2.Start();
task.Wait();
Console.WriteLine(_num);
}
}
}
다음과 같이 작업 후 디버깅해보았는데 결과값이 때로는 맛이 간 값을 출력합니다.
제시된 코드와 같은 것 같은데 이유를 모르겠습니다!
그리고 다음과 같은 상황일 때 어떻게 브레이크포인트를 잡아서 버그수정을 시도해야 할 지 감이 안잡힙니다ㅠㅠ
아이고 저도 이제야 알았습니다ㅠㅠ