[OS] 12. Race Condition

dnjstjt12·2024년 11월 4일

Race Condition

  • 두개 이상의 Process나 Thread가 공유자원을 읽거나 쓰는 동작을 할 때, 결과값이 의도와 달라질 수 있는 문제를 말한다. Sychronization problem이라고도 한다.

다음의 코드를 살펴보자

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>


void* race_condition_test(void* data){
    int* A = data;
    
    for(int i =0;i<10000;i++){
        *A = *A+1;
        printf("result:%d\n", *A);
    }
}

int main(){
    pthread_t p1, p2;
    int *result = (int*)malloc(sizeof(int));
    *result = 0;

    pthread_create(&p1,NULL, race_condition_test, (void*)result);
    pthread_create(&p2,NULL, race_condition_test, (void*)result);
    
    race_condition_test(result);

    pthread_join(p1,NULL);
    pthread_join(p2,NULL);
    free(result);

    return 0;
}

결과:

thread 3개로 race_condition_test를 30000번 실행시켜보았다.
원래는 30000의 결과가 나와야하지만 예상과 다르게 29994의 결과 값이 나왔다.

thread들이 result값을 동시에 참조하여 수정해 race condition이 발생했기 때문에 이러한 결과가 나온 것이다.

Critical Section

  • 공유자원이 접근되고 수정되는 영역의 코드조각이다.

  • 위의 코드에서 Critical Section은 반복문 안의 *A = *A+1;이다.

profile
안녕하세요!

0개의 댓글