2011-02-08 3 views
1

죄송합니다.이 코드는 여기에 있습니다. http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html이 뮤텍스는이 코드로 설명되었지만 약간 이상했습니다. 나는 뮤텍스의 기능을 이해하고 그것의 임계 영역에서 공유 변수를 보호한다. 여기의 구체적인 것은 나를 혼란스럽게하고있다! 필자는 필자가 pthread_create를 사용하여 새 스레드를 만들고 카운터를 증가시키는 functionC 프로세스를 실행 중입니다. 카운터는 보호 된 변수이며 두 함수가 동시에 실행 중이므로 뮤텍스에 의해 보호되지 않은 경우 카운터는 잘못된 값을 반환합니다.몇 가지 간단한 C 코드 내가 이해할 수 없다 - 여기서 뮤텍스는 무엇입니까?

이 정보가 올 바르고 올바른가요? 고마워. :).

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

void *functionC(); 
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; 
int counter = 0; 

main() 
{ 
    int rc1, rc2; 
    pthread_t thread1, thread2; 

    /* Create independent threads each of which will execute functionC */ 

    if((rc1=pthread_create(&thread1, NULL, &functionC, NULL))) 
    { 
     printf("Thread creation failed: %d\n", rc1); 
    } 

    if((rc2=pthread_create(&thread2, NULL, &functionC, NULL))) 
    { 
     printf("Thread creation failed: %d\n", rc2); 
    } 

    /* Wait till threads are complete before main continues. Unless we */ 
    /* wait we run the risk of executing an exit which will terminate */ 
    /* the process and all threads before the threads have completed. */ 

    pthread_join(thread1, NULL); 
    pthread_join(thread2, NULL); 

    exit(0); 
} 

void *functionC() 
{ 
    pthread_mutex_lock(&mutex1); 
    counter++; 
    printf("Counter value: %d\n",counter); 
    pthread_mutex_unlock(&mutex1); 
} 

답변

3

당신이 장소에 뮤텍스가없는 경우,이 일어날 것입니다 : 그래서

// initialization 
counter = 0; 

// thread 1 runs: 
counter++; 

// context switch 
// thread 2 runs: 
counter++; 

// context switch 
// thread 1 runs and printf "Counter value: 2" 
printf("Counter value: %d\n",counter); 

// context switch 
// thread 2 runs and printf "Counter value: 2" 
printf("Counter value: %d\n",counter); 

,이 출력으로 끝낼 수 있습니다 뮤텍스와 지금

Counter value: 2 
Counter value: 2 

제자리에서 증분 및 해당 인쇄물이 원자 적으로 실행되는지 확인하십시오. 따라서 출력이 100 % 확신 할 수 있습니다.

Counter value: 1 
Counter value: 2 

하지만 결코 :

Counter value: 2 
Counter value: 2 
+2

이것은 하나의 가능한 시나리오이지만 다른 하나는 '카운터'의 최종 값은 예상되는 2가 아닌 1입니다. "카운터 값 : 1"이 두 번 표시되면 결국 나타날 수 있습니다. –

+0

참. C 언어는 ++ 연산이 원 자성인지 여부를 정의하지 않습니다. –

3

귀하의 설명이 정확합니다. 둘 이상의 스레드가 counter을 동시에 수정하려고 시도하면 업데이트가 손실 될 수 있습니다.

1

예. 올바른 것입니다. 뮤텍스 (mutex)는 스레드가 카운터를 증가 시키려고 시도 할 때 스레드가 서로 밟는 것을 방지합니다.

증가 연산자가 반드시 원자 연산이 아니기 때문에 (자세한 내용은 here 참조) 동일한 변수를 여러 스레드에서 증가 시키면 예기치 않은 결과가 발생할 수 있습니다. 뮤텍스 (mutex)는 한 번에 하나의 스레드 만 카운터를 증가시킬 수 있도록 허용함으로써 이러한 상황을 방지합니다.

끝에있는 join 문은 주 프로그램과 두 스레드가 모두 동시에 종료되는지 확인합니다. 그렇지 않으면 주 프로그램이 종료되고 쓰레드가 매달리게됩니다.

관련 문제