수색…


소개

멀티 스레드 응용 프로그램을 작성할 때 경험하게되는 가장 일반적인 문제 중 하나는 경쟁 조건입니다. 그래서 우리는 당신이 그들을 어떻게 감지합니까? 어떻게 그들을 처리합니까?

예 : 두 개의 스레드 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 잠금 및 잠금 해제에는 과부하가 있기 때문입니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow