static int number = 0;
static void Thread_1()
{
for(int i=0; i<1000000; i++)
{
number++;
}
}
static void Thread_2()
{
for (int i = 0; i < 1000000; i++)
{
number--;
}
}
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(number);
}
각 쓰레드는 number의 값을 1씩 증가, 감소시키는 작업을 한다.
실행하면 우리가 기대하는 결과값은 0이 나와야 한다.
왜 위와 같은 값이 나올까?
Race Condition 때문이라 할 수 있다.
Race Condition이란 두 개 이상의 concurrent한 프로세스(혹은 스레드)들이 하나의 자원(리소스)에 접근하기 위해 경쟁하는 상태를 말한다.
출처: https://zangzangs.tistory.com/115 [장장스:티스토리]
number++;
=================
int tmp = number;
temp += 1;
number = temp
number++은 실제적으로 값을 불러오고 그 값을 증가시켜 다시 원래 주소에 저장하는 3단계를 거친다.
하지만 두개의 스레드가 동시에 작업하면 위의 세 작업은 뒤죽박죽으로 실행될 것이다.
따라서 우리가 원하는 결과가 나오지 않는다.
number++이 원하는 대로 작업하기 위해서는 세 단계가 atomic하게 일어나야 한다.
즉, 한번 값을 불러오면, 값을 다시 저장하기까지의 과정이 연속적으로 일어나야 한다.
도중에 다른 스레드에서 그 값에 접근하면 안 된다는 말이다.
위 함수를 통해 atomic하게 증가, 감소를 시킬 수 있다.