2013-03-12 6 views
14

Ich habe Probleme bei der Analyse eines Problems bei einer früheren OS-Prüfung. Es ist wie folgt:Race Conditions in C

Beschreiben Sie die Ausgabe des folgenden Programms. Gibt es eine Race Condition?

int count=0; 
int main(void) 
{ 
    pid_t pid;  
    if((pid = fork()) < 0)  
    {  
     perror("Fork error");  
     exit(1);  
    } 
    else if(pid == 0) 
    {  
     charatatime("Output 1\n"); 
    }  
    else  
    {  
     charatatime("Output 2\n"); 
    } 

    printf(“Count = %d”,count); 
    exit(0); 
} 

static void charatatime(char * str) 
{ 
    char * ptr;  
    int c; 
    for(ptr = str; c = *ptr++;) 
    { 
     count++;   
     putc(c, stdout); 
    } 
} 

Ich bin noch nicht so gut mit C und Race-Bedingungen, so ist meine Antwort meist eine Vermutung. Aber wenn ich das auf einer Prüfung sah, würde ich sagen: "Das Programm teilt einen Prozess in einen Eltern- und Kindprozess auf, der Kindprozess druckt 'Output1' und der Elternteil druckt 'Output2', jeweils ein Zeichen. Dann die Gesamtanzahl Die Anzahl der Buchstaben wird am Ende des Programms gedruckt, jedoch kann diese Variable "count" ungenau sein, da zwischen dem Kind und dem Elternteil eine Race-Bedingung besteht. Jeder kann jederzeit auf die Zählung zugreifen und diese aktualisieren, was zu Ungenauigkeiten führen kann.

Aus meinem Verständnis ergeben sich Race Conditions, wenn zwei oder mehr Threads oder Prozesse versuchen, auf dieselbe gemeinsame Variable zuzugreifen oder sie zu setzen, und der einzige Vorfall, den ich in diesem Programm sehen kann, ist 'count'. Bin ich irgendwo in der Nähe richtig, und wenn nicht, was könnte zu diesem Programm hinzugefügt werden, um eine Race Condition zu erstellen (hypothetisch, natürlich; ich weiß, das ist nicht das, was wir tun wollen)?

+8

+1 für einen vernünftigen Versuch, dies vor der Veröffentlichung auf SO –

+3

"count" ist hier nicht freigegeben, jeder Prozess hat seine eigene Kopie. –

+0

Nicht wirklich eine Race Condition, aber der Putc würde sich zwischen den beiden Threads verschränken. – Neil

Antwort

14

Was count betrifft, gibt es keinen Wettlauf: Jeder der beiden Prozesse hat seinen eigenen separaten count.

In der Reihenfolge, in der die Zeichen "Output 1" und "Output 2" auf stdout erscheinen, gibt es tatsächlich ein Rennen: die beiden Ausgänge können beliebig verschachtelt enden.

+0

Okay. So könnte es wie "OOutputput 1 2" oder irgendeine andere willkürliche Reihenfolge drucken? Und das wäre gelöst, indem man (irgendwo) eine Sperre hinzufügt? – aquemini

+0

@CoconutJones: Ja und ja. – NPE

+0

Ausgezeichnet. Danke dir und allen! – aquemini