using System;
namespace ServerCore
{
class Program
{
static int number;
static void Thread_1()
{
for (int i = 0; i < 100000; i++)
{
number++;
}
}
static void Thread_2()
{
for (int i = 0; i < 100000; 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);
}
}
}
μ΄ κ²½μ° 0 μ΄ λμμΌ νμ§λ§, 0μ΄ λμ€μ§ μλλ€.
// number++;
int temp = number;
temp += 1;
number = temp;
number++ μ μ€μ λ‘ μ€νλ λ λ€μκ³Ό κ°μ 3κ°μ§ κ³Όμ μ κ±°μΉλ€.
λμ΄μ μͺΌκ°€ μ μλ μμ μΈ μμμ± μ΄λΌκ³ νλ€.
μ μμ κ³Όμ μ΄ νλ²μ μ΄λ£¨μ΄μ ΈμΌ νλ―λ‘ Interlockedλ₯Ό μ¬μ©ν΄μΌ νλ€.
static void Thread_1()
{
for (int i = 0; i < 100000; i++)
{
Interlocked.Increment(ref number);
}
}
static void Thread_2()
{
for (int i = 0; i < 100000; i++)
{
Interlocked.Decrement(ref number);
}
}
λμ λ€λ°μ μ΄μ¬λ μμκ° μκΈ΄λ€.(Race Condition λ¬Έμ )
static void Thread_1()
{
for (int i = 0; i < 100000; i++)
{
int prev = number;
Interlocked.Increment(ref number);
int next = number;
}
}
μ±κΈμ€λ λκ° μλλ―λ‘ κΊΌλ΄μ€λ μκ°μ μ΄λκ°μμ 건λ릴 μκ° μλ€. μ¦, μ ν¨νμ§ κ²μ¦μ ν μ μλ€.
int afterValue = Interlocked.Increment(ref number);
μ΄λ°μμΌλ‘ κ°μ κ°μ ΈμμΌ μ ν¨ν κ°μ μ»μ μ μλ€.