9κ° InterLocked
λΆμ : κ²½ν© μ‘°κ±΄ (Race condition)
곡μ λ³μ μ κ·Όμ λ¬Έμ μ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Program{
static int num = 0;
static object obj = new object();
static void Tread_1(){
for(int i=0; i< 10000; i++){
num++;
}
}
static void Tread_2(){
for (int i=0; i<10000; i++){
num--;
}
}
}
//...
//μ€λ λλ€ μ€νμν€λ ꡬ문
- 10000λ²μ© 1μ© λνκ³ 1μ© λΉΌλ μ½λ
- κ²°κ³Όλ‘ 0μ΄ λμ¨λ€ (λμμΌ νλ€) β νμ§λ§ μ΄μν κ°μ΄ λμ€λ€?
- int numberμ volatile ν€μλλ₯Ό λΆμ¬λ λκ°μ΄ μ΄μν κ°μ΄ λμ΄
κ²½ν© μ‘°κ±΄
Race condition
μ€ν 리μ λΉκ΅
- μλ 1λͺ κ³Ό μ§μ 3λͺ
- μλμ΄ μ½λΌ νλλ₯Ό μ£Όλ¬Έμν΄
- μ§μ 3λͺ μ΄ νλμ© μ½λΌλ₯Ό κ°μ Έλ€μ€
- μλμ λ³μκ° μ½λΌκ° 3κ°λ₯Ό λ°κ²λ¨
- == κ²½ν© μ‘°κ±΄ λ°μν κ² !
++ μ°μ°μμ μ€ν μ리
1
num++;
μ μ½λμ μ΄μ λΈλ¦¬ μ½λμμμ μ€ν μ리λ λ€μκ³Ό κ°λ€
1
2
3
int tmp = num;
tmp += 1;
num = tmp;
- λ μμμ
tmp -= 1;
μΌλΏ λ§μ°¬κ°μ§μ΄λ€.
- λ μμμ
μ€λ λμμ μ΄ μ½λκ° μ€νλλ λμ€ κ²½ν©μ΄ μΌμ΄λκ² λμ΄μ μ΄μν κ°μ΄ λμ¨ κ² κ°λ€.
Interlocked λ₯Ό μ΄μ©ν ν΄κ²°λ²
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Program{
static int num = 0;
static object obj = new object();
static void Tread_1(){
for(int i=0; i< 10000; i++){
Interlocked.Increment(ref num);
}
}
static void Tread_2(){
for (int i=0; i<10000; i++){
Interlocked.Decrement(ref num);
}
}
}
// ...
//μ€λ λλ€ μ€νμν€λ ꡬ문
- ++μ
Interlocked.Incremnt(ref num)
- μ
Interlocked.Decrement(ref num)
- μ
- μ€λ λ 1κ³Ό 2μ (1) ++κ³Ό (2) - - μμ μ΄ μμμ μΌλ‘ μΌμ΄λκ² λλ€
- μμμ := μμ°¨μ μΌλ‘ (1) μμ λ€μ (2) μμ μ΄ μΌμ΄λκ² λλ€ (μμκ° λ³΄μ₯λ¨)
Interlocked.increment (ref num) μμ refμ μ¬μ©
μ€μ num βκ°βμ΄ μλλΌ numμ μ£Όμλ₯Ό κ°μ Έμμ λ νΌλ°μ€λ₯Ό μ¬μ©ν¨
Interlock.Decrement () μ λ¨μ
λλΆλΆ μ μλ§ μ¬μ©κ°λ₯
μ¬μ©ν μ μλ κ²μ΄ νμ λμ΄ μμ