2
아주 간단한 C 예제로 연주하고 있습니다. 프로그램은 두 개의 스레드를 생성하고 병렬로 시작합니다. 각 스레드는 뮤텍스를 사용하여 전역 변수를 수정하고 값을 출력하도록 설계되었습니다. 화면 출력을 뮤텍스와 pthread와 동기화하기
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
int A=10;
pthread_mutex_t M;
void *codice_Th1(void *arg) {
int i;
for (i=0; i<10;i++){
pthread_mutex_lock(&M);
printf("Thread %s: ", (char *)arg);
A++;
printf("A = %d \n", A);
pthread_mutex_unlock(&M);
sleep(1);
}
pthread_exit(0);
}
void *codice_Th2(void *arg) {
int i;
for (i=0; i<10;i++){
pthread_mutex_lock(&M);
printf("Thread %s: ", (char *)arg);
A--;
printf("A = %d \n", A);
pthread_mutex_unlock(&M);
sleep(1);
}
pthread_exit(0);
}
main()
int main(){
pthread_t th1, th2;
...
}
어떤 날 귀찮게을 함께 메인 스레드에 가입, 나는 다음과 같은 출력을 얻을 것입니다
Thread th1: Thread th2: A = 11
A = 10
Thread th1: A = 11
Thread th2: A = 10
Thread th1: Thread th2: A = 11
A = 10
Thread th1: Thread th2: A = 11
A = 10
Thread th2: Thread th1: A = 9
A = 10
Thread th1: A = 11
Thread th2: A = 10
반면에 mutex 내부에있는 모든 행은 차례대로 printf
명령문을 실행해야합니다. 즉
, 내가 OUPUT
Thread th2: Thread th1: A = 9
난 항상
Thread NAME: A = VALUE
비슷한 기대
를 이해할 수 있습니까 내가 모르는 뭔가가?
미래에'main' 함수의 전체 (또는 적어도 관련 부분)를 포함 시켜서 이러한 오류를 찾을 수 있습니다. –
@Daniel 당신은 절대적으로 옳습니다. 나는 실수로'main()'이 게시 될 가치가없는 단순한 것이라고 가정했다. –
컴파일 타임에 경고 또는 오류를 생성 할 수 없습니다 ... 컴파일러가이 함수를 호출해야한다는 것을 어떻게 알 수 있습니까? 그것이 실제로 불리는 지 어떻게 알 수 있습니까? 변수 초기화는 C에서 매우 흔한 실수이며, 금지되지 않는다는 것을 기억하십시오. 그것들을 사용하는 것은 UB입니다. 이것은 정확히 뮤텍스에서 일어난 일입니다. –