2016-10-25 1 views
0

Ich habe eine Frage und ihre Antworten von einer alten Prüfung, aber ich verstehe die Lösung nicht. Kann mir das jemand erklären?kann jemand die Lösung dieser beiden Fragen (c Programm, Mutex, Threads) erklären?

dieses C-Programm Gegeben:

int a = 0; 
int b = 0; 
pthread_mutex_t m; 

void * f() 
{ 
    _________________ (Empty Line for question number 2) 
    a = a + 1; 
    pthread_mutex_lock(&m); 
    b = b + 1; 
    printf("a = %d, b = %d\n", a, b); 
    pthread_mutex_unlock(&m); 
    return NULL; 
} 

int main() { 
    pthread_t t1, t2; 
    pthread_mutex_init(&m, NULL); 
    pthread_create(&t1, NULL, &f, NULL); 
    pthread_create(&t2, NULL, &f, NULL); 
    pthread_join(t1, NULL); 
    pthread_join(t2, NULL); 
    return 0; 
} 
  1. Wie viele verschiedene Druckausgaben das Programm abgeben kann? (Die Antwort ist 3)
  2. Welchen Code können Sie an der leeren Zeile hinzufügen, um die verschiedenen Druckoptionen auf 1 zu reduzieren? (die Antwort ist int a=0;)

Wie soll ich zu diesen Antworten gekommen sein?

+3

Was ist eine Druckoption? – mch

+1

Dort ist ein Rennzustand auf "a". Die Variable 'a' kann nach Ausführung des Programms 1 oder 2 sein. Und ich wette, dass das etwas mit den mysteriösen Druckoptionen zu tun hat. –

+0

Das Betriebssystem-Tag passt nicht wirklich zur Frage –

Antwort

0

Ich nehme nur an, dass Sie verschiedene Wertkombinationen von a und b meinen, die gedruckt werden, durch "Druckoptionen".

Also am Anfang haben Sie a und b = 0

Dann Sie die Threads erstellen, und es ist ein Rennzustand auf a so das Ergebnis ist nicht deterministisch. Was könnte passieren:

t1:read a=0 write a=0+1 
t1:read b=0 write b=0+1 
t1:print `a=1, b=1` 
t2:read a=1 write a=1+1 
t2:read b=1 write b=1+1 
t2:print `a=2, b=2` 

das andere, was passieren könnte:

t1: read a =0 
t2: read a =0 
t1: write a =0+1 
t2: write a =0+1 
t1: read b=0 write b=0+1 
t1: print `a=1, b=1` 
t2: read b=1 write b=1+1 
t2: print `a=1, b=2` 

Dies ist eine Möglichkeit. Das Lesen und Schreiben von a kann jederzeit passieren. Aber dies sind Beispiele dafür, wie unterschiedliche Ergebnisse auftreten können. t1 und t2 sind ebenfalls austauschbar. Es gibt keine Garantie, dass t1 zuerst ausgeführt wird.

Die zweite Antwort verbirgt die globale a mit a lokale a, die nicht durch den anderen Thread überschrieben werden kann. Also wäre die Ausgabe immer.

a=1, b=1 a=1, b=2

edit: das dritte Druckszenario für die erste Frage vergessen

a=2, b=1 a=2, b=2

dies geschieht, wenn a gelesen und separat geschrieben (gelesen erster Schreib t1 dann Schreib lesen t2) aber bevor der erste Thread druckt.

Verwandte Themen