-
데이터 레이스(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]
- a를 읽어 %o1에 저장
- %o1에 4를 더함
- %o1의 값을 a에 저장
Thread[1]
- a를 읽어 %o1에 저장
- %o1에 4를 더함
- %o1의 값을 a에 저장
덧셈은 두 번 이루어졌지만 a의 값은 14. 기대했던 18이 아닌 14이다.
이러한 상황은 동시에 실행될 때 발생하는 데이터 레이스의 쉬운 예시이다.
데이터 레이스의 상황은 메모리에 있는 변수가 레지스터로 로딩되어 계산을 수행하는데,
다른 스레드가 해당 변수에(메모리에 있는) 새로운 값을 써넣을 때 발생한다.
데이터 레이스 방지
데이터 레이스를 방지하기 가장 쉬운 방법은 변수의 값을 변경하는 부분에 동기화 락(syncronization lock)을 걸어두는 것이다.
락을 이용하면, 코드의 정상 동작은 보증되지만 성능 측면에선 손해를 보게 된다.
- 관련 글
- [프로그래밍/개념/용어] - 스핀락(Spinlock)
- [프로그래밍/개념/용어] - 세마포어(Semaphore)
- [프로그래밍/개념/용어] - 리더즈-라이터 락(Readers-Writer Lock)
- [프로그래밍/개념/용어] - 배리어(Barrier)
- [프로그래밍/개념/용어] - 원자적 조작과 락-프리 코드(Atomic operation & Lock-Free code)
- [프로그래밍/개념/용어] - 뮤텍스(Mutex)와 크리티컬 리전/섹션(Critical Region/Section)
반응형'프로그래밍 > 기록, 개념, 용어' 카테고리의 다른 글
반환값 최적화 RVO, NRVO (0) 2015.03.01 데드락(Deadlock)과 라이브락(Livelock) (0) 2015.02.05 뮤텍스(Mutex)와 크리티컬 리전/섹션(Critical Region/Section) (0) 2015.02.05 원자적 조작과 락-프리 코드(Atomic operation & Lock-Free code) (0) 2015.02.05 배리어(Barrier) (0) 2015.02.05