Interlocked

Icarus_wΒ·2022λ…„ 12μ›” 26일
0
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);

μ΄λŸ°μ‹μœΌλ‘œ 값을 가져와야 μœ νš¨ν•œ 값을 얻을 수 μžˆλ‹€.

profile
ν•˜λ£¨μ— ν•˜λ‚˜

0개의 λŒ“κΈ€