프로그래밍/기록, 개념, 용어

데이터 레이스(Data Race)

제페 2015. 2. 5. 01:55
반응형

데이터 레이스는 다중 스레드 프로그래밍을 할 때 범하기 쉬운 오류 중 하나이다.

데이터 레이스는 멀티 스레드를 이용하는 환경에서, 같은 데이터를 이용하고 다른 스레드에서 그것을 업데이트 할 때 발생한다.

아래와 같은 코드가 있다.

// a를 읽어 %o1에 저장
// %o1에 4를 더함
// %o1를 a에 저장

void update_int( int* data )
{
  *a = *a + 4;
}

 

이 코드가 멀티 스레드로 구동되고, 두 스레드에서 동시에 같은 데이터의 값을 증가시키려 할 때는 이런 상황이 발생할 수 있다.

int a = 10; // a는 여러 쓰레드에서 공유가 되고있는 변수이다.

Thread[0]

  1. a를 읽어 %o1에 저장
  2. %o1에 4를 더함
  3. %o1의 값을 a에 저장

Thread[1]

  1. a를 읽어 %o1에 저장
  2. %o1에 4를 더함
  3. %o1의 값을 a에 저장

덧셈은 두 번 이루어졌지만 a의 값은 14. 기대했던 18이 아닌 14이다.

 

이러한 상황은 동시에 실행될 때 발생하는 데이터 레이스의 쉬운 예시이다.

데이터 레이스의 상황은 메모리에 있는 변수가 레지스터로 로딩되어 계산을 수행하는데, 

다른 스레드가 해당 변수에(메모리에 있는) 새로운 값을 써넣을 때 발생한다.

 

데이터 레이스 방지

데이터 레이스를 방지하기 가장 쉬운 방법은 변수의 값을 변경하는 부분에 동기화 락(syncronization lock)을 걸어두는 것이다.

락을 이용하면, 코드의 정상 동작은 보증되지만 성능 측면에선 손해를 보게 된다.

 

- 관련 글

 

 

 

반응형