pthreads
pthreads의 레이스 컨디션
수색…
소개
예 : 두 개의 스레드 T1과 T2가 있다고 가정합니다.
어떻게 감지합니까?
동일한 변수 / 리소스 / 메모리 위치 가 여러 스레드에서 액세스 할 수 있고 적어도 스레드가 변수 / 리소스 / 메모리 위치 의 값을 변경하면 경쟁 조건 이 발생할 수 있습니다. 스레드가 variable / resource / memory 위치 의 값을 변경하고 다른 스레드가 동일한 값을 읽으려고 시도하면 업데이트 된 값을 얻지 못하기 때문입니다.
참고 : 모든 스레드가 변수 / 리소스 / 메모리 위치 를 읽는 중이 라면 경쟁 조건 이 발생하지 않습니다.
예 : 프로그램은 인종 조건으로 인해 어려움을 겪습니다.
#include <stdio.h>
#include <pthread.h>
int x= 0;
void* fun(void* in)
{
int i;
for ( i = 0; i < 10000000; i++ )
{
x++;
}
}
int main()
{
pthread_t t1, t2;
printf("Point 1 >> X is: %d\n", x);
pthread_create(&t1, NULL, fun, NULL);
pthread_create(&t2, NULL, fun, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
printf("Point 2 >> X is: %d\n", x);
return 0;
}
내 화면의 출력은 다음과 같습니다.
Point 1 >> X is: 0
Point 2 >> X is: 9925047
귀하의 산출물은 다양합니다. 그러나 그것이 2 천만 명이되지는 않을 것이라고 확신합니다. 두 스레드가 동일한 루프를 실행하고 전역 변수 int x; 가짐
for ( i = 0; i < 10000000; i++ )
{
x++;
}
따라서 라인 Point 2 >> X is: 9925047 x Point 2 >> X is: 9925047 의 최종 값은 Point 2 >> X is: 9925047 이 20,000,000이어야합니다. 그러나 그렇지 않습니다.
x의 상태는 x가 읽히는 시간과 다시 쓰여지는 시간 사이에 다른 스레드에 의해 변경 될 수 있습니다.
스레드가 x의 값을 검색하지만 아직 저장하지 않았다고 가정 해 봅시다. 또 다른 스레드는 x의 동일한 값을 검색 할 수 있습니다 (스레드가 아직 변경하지 않았으므로). 그러면 둘 다 동일한 값 (x + 1)을 x에 다시 저장합니다.
예:
스레드 1 : x를 읽습니다. 값은 7입니다.
스레드 1 : x에 1을 더하고, 값은 이제 8입니다.
스레드 2 : x를 읽습니다. 값은 7입니다.
스레드 1 : 상점 8에 x
스레드 2 : x에 1을 더하고, 값은 이제 8입니다.
스레드 2 : x를 8 개 저장
어떻게 처리합니까?
레이스 조건은 공유 리소스 또는 상호 배타를 액세스하는 코드 앞에 어떤 종류의 잠금 메커니즘을 사용하여 피할 수 있습니다.
다음은 수정 된 프로그램입니다.
예 : 인종 조건 문제 해결
#include <stdio.h>
#include <pthread.h>
int x= 0;
//Create mutex
pthread_mutex_t test_mutex;
void* fun(void* in)
{
int i;
for ( i = 0; i < 10000000; i++ )
{
//Lock mutex before going to change variable
pthread_mutex_lock(&test_mutex);
x++;
//Unlock mutex after changing the variable
pthread_mutex_unlock(&test_mutex);
}
}
int main()
{
pthread_t t1, t2;
printf("Point 1 >> X is: %d\n", x);
//Initlize mutex
pthread_mutex_init(&test_mutex, NULL);
pthread_create(&t1, NULL, fun, NULL);
pthread_create(&t2, NULL, fun, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
//Destroy mutex after use
pthread_mutex_destroy(&test_mutex);
printf("Point 2 >> X is: %d\n", x);
return 0;
}
출력은 다음과 같습니다.
Point 1 >> X is: 0
Point 2 >> X is: 20000000
여기서, 매 해 20,000,000이라는 대답이 나온다.
참고 : 경쟁 조건 오류가없는 수정 된 프로그램은 실행에 많은 시간이 소요됩니다. mutex 잠금 및 잠금 해제에는 과부하가 있기 때문입니다.