volatile

변수의 값을 캐시에 저장하지 않고 항상 메모리에서 값을 읽어오도록 한다.

멀티 스레딩 환경에서 여러 스레드가 동시에 하나의 변수에 접근할 때 캐시에 저장된 값과 메모리의 실제 값이 일치하지 않아서 오류가 발생할 수 있다.

 

int counter = 0;

void IncrementCounter()
{
    for (int i = 0; i < 100000; i++)
    {
        counter++;
    }
}

void DecrementCounter()
{
    for (int i = 0; i < 100000; i++)
    {
        counter--;
    }
}

void Main()
{
    Thread t1 = new Thread(IncrementCounter);
    Thread t2 = new Thread(DecrementCounter);

    t1.Start();
    t2.Start();

    t1.Join();
    t2.Join();

    Console.WriteLine("Counter value: " + counter);
}

 

위 코드에서 counter변수에 서로 다른 스레드에서 거의 동시에 접근하여 값을 변경하고 있다.

이때 counter는 항상 0이 아니며 일정하지 않은 값들로 출력된다.

 

이러한 상황에서 volatile 키워드로 변수를 선언하면 항상 일정한 값이 들어오게 된다.

 

int volatile counter = 0;

 

728x90
반응형

'Program Language > C#' 카테고리의 다른 글

C# 고정소수점 키워드 : decimal  (0) 2023.04.25
C# Yes or No 키워드 : bool  (0) 2023.04.25
C# 안전하지 않은 키워드 : unsafe  (0) 2023.04.25
C# 정적 키워드 : static  (0) 2023.04.25
C# 상속 방지 키워드 : sealed  (0) 2023.04.25

+ Recent posts