Race Condition
다음의 코드를 살펴보자
#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;이다.