"데이터레이스"란?

멀티 쓰레드 환경에서 여러 쓰레드가 공유자원에 동시에 접근할 때 쓰레드의 경쟁에 유발되는 문제입니다. 

아래의 예제를 통해서 "데이터 레이스"에 대해서 설명을 진행합니다.

 

<c++로 된 예제 소스>

#include <thread>
// 전달받은 객체에 값을 더합니다. 
int g_num = 10;
void add(int & num)
{
	num += 5;
}

// 만약에 아래의 함수를 2개의 쓰레드에서 동시에 접근한다면 어떠한 현상이 발생할까?
add(g_num);

만약에 위의 add()함수를 2개의 쓰레드에서 동시에 접근한다면 어떻게 될 것인가?

각 쓰레드는 아래와 같이 순서대로 구문을 실행 할 것입니다. 


1. num변수의 값을 Load 합니다.


2. Load된 num에 5를 더합니다. (15를 계산)


3. 계산된 데이터인 15를 num변수에 저장합니다.


 

각 쓰레드는 num을 10으로 읽어 들이게 되고 15라는 값을 계산 한 후에

각각 15로 덮어씌우는 작업을 진행이 될 것입니다. 

우리가 예상하는 값은 20이지만 결과는 15가 나오는 현상이 발생합니다. 

 

이렇게 스레드간에 공유되는 자원에 서로 경쟁하여 데이터를 읽고 쓰면서 서로의 연산결과가 덮어 씌워져서 

예상되는 결과와 다른게 나오는 현상을 "데이터 레이스"라고 합니다.

이러한 현상을 방지하기 위해서 동기화 기법을 사용해서 공유되는 자원에 대해서 접근방법을 관리합니다. 

'기타' 카테고리의 다른 글

정규 표현식  (0) 2020.07.05

+ Recent posts