CriticalSection - Deadlock mit Threads



  • Hallo zusammen,

    ich habe für unser Unternehmen ein kleines Tool geschrieben.
    In diesem Tool arbeite ich mittlerweile mit mehreren Threads die aus einer bestimmten Datei lesen und auch in diese Datei schreiben.
    Die Threads rufen eine Funktion auf, in dieser Funktion wird zuerst die ganze Datei gelesen, dann wenn der Wert nicht vorhanden ist wird in die Datei geschrieben.

    Ich habe jetzt eine CS in meiner WinMAIN initialisiert:

    //---Initialisiere Critical Section für das Schreiben und Lesen in die Zieldatei 
    	InitializeCriticalSection(&csResultFileAccess);
    

    Die Funktion die dazu genutzt wird eine Datei zu lesen und zu schreiben:

    int CheckStatusFile(char *pInput) {
    	FILE *read=NULL,*write=NULL;
    	char buf[MAX];
    	int len;
    
    	len = 0;
    	memset(buf,0,sizeof(buf));
    
    	EnterCriticalSection(&csResultFileAccess);
    
    	read = fopen("Statusfile.log","r+"); 
    
    	if(read != NULL) {
    
    		while(fgets(buf,MAX,read)) { 
    
    			if(strcmp(pInput,buf) == 0) {
    				fclose(read); 
    				return 0;
    			}
    		}	
    		fclose(read); //schließe handle
    	}
    
    	write = fopen("Statusfile.log","a"); 
    
    	if(write == NULL)
    		return 0;
    	else {
    		len = strlen(pInput);
    		if(len == 0)
    			return 0;
    	}
    
    	pInput[len] = '\n'; 
    	fputs(pInput,write);
    	fclose(write); 
    
    	LeaveCriticalSection(&csResultFileAccess);
    
    	return 1;		
    }
    

    In dem Code sieht man ja auch schön den Aufruf von EnterCriticalSection() und LeaveCriticalSection().
    Leider bleibt mein Tool dann stehen und es passiert nichts mehr.
    Was ist mein Fehler mit den CriticalSection ?

    LG



  • Hallo

    Als erstes, wo genau bleibt dein Programm stehen?

    Zum anderen mal gleich vorne weg, ist dir aufgefallen, das du einige ausstiegsstellen in deinem Code hast, an denen die CS nicht verlassen wird? (Schau dir die return's mittendrin an)

    Deswiteren ist dein code auch nicht exception-Save, also bei werfen einer exzeption würde die CS auch stehen bleiben.

    Und ich glaube das sind auch deine Probleme wieso das Prpgramm hängt.

    Mfg Marco



  • Danke für die rasche Antwort.

    Zum anderen mal gleich vorne weg, ist dir aufgefallen, das du einige ausstiegsstellen in deinem Code hast, an denen die CS nicht verlassen wird? (Schau dir die return's mittendrin an)

    Tatsächlich das war der Fehler ....

    Deswiteren ist dein code auch nicht exception-Save, also bei werfen einer exzeption würde die CS auch stehen bleiben.

    Was mit exception-Save gemeint ?

    LG



  • Marc-O schrieb:

    Deswiteren ist dein code auch nicht exception-Save, also bei werfen einer exzeption würde die CS auch stehen bleiben.

    Ich finde es auch gut immer exception-safe zu programmieren. Zumindest wo immer es einfach geht (was ja hier der Fall wäre), egal ob es an der jeweiligen Stelle gerade braucht oder nicht.

    In dem gezeigten Code kommt allersdings innerhalb des Lock/Unlock Paares nichts vor was eine Exception werfen könnte.
    Bzw. genaugenommen in der gesamten Funktion.

    Da der OP auch "C" Tags (ohne "++") verwendet, und der Code auch sehr "C-ig" aussieht, wäre naheliegend dass er C Programmiert. Und daher gar nicht exception-safe programmieren kann (zumindest nicht ohne non-standard Extensions wie __try/__finally).


Anmelden zum Antworten