Threat sichere Funktion?



  • Hallo,

    zum Aneinanderreichen von diversen Variablene benutzte ich untenstehende Funktion, leider scheint diese Funktion nicht Threat-sicher zu sein, denn es kommt in meinem Programm ab und zu vor dass irgendwas ausgegeben wird das aussieht als ob es irgendwo aus dem Speicher geholt wird.

    #define _INTSIZEOF(n)		((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1))
    #define va_start(ap,v)		(ap = (va_list)&v + _INTSIZEOF(v))
    #define va_end(ap)		(ap = (va_list)0)
    
    char	*va(char *format, ... ){
    
    	va_list		argptr;
    	static char	string[2][32000];
    	static int		index = 0;
    	char		*buf;
    
    	buf = string[index & 1];
    	index++;
    	va_start(argptr, format);
    	vsprintf (buf, format,argptr);
    	va_end(argptr);
    	return buf;
    }
    
    int main(int argc, char *argv[])
    
    	char	a1[128], a2[128];
    	int	z1,z2;
    
    	:
    	:
    	:
    	:
    	strcpy(buffer, va("Ausgabe1: %s Ausgabe2: %s Zahl1:  %i Zahl2:  %i", a1, a2, z1, z2)
    	:
    	:
    	:
    	return 0;
    }
    

    ich denke mal dass bei einer multi-Threat Anwendung irgendwas mit dem Stack schiefläuft. Wie würdet ihr das Problem lösen um solch eine Funktion in einer Multithreatanwendung korrekt zu realisieren?



  • Hi,

    du solltest statische und globale Variablen in einer multithreaded
    Anwendung nicht verwenden, oder mit Mutexen Sicherstellen, dass keine
    zwei Threads gleichzeitig auf eine Variable zugreifen können.

    Zu deiner va-Funktion:
    Du hast 2 Buffer der Größe 32000bytes die du nacheinander füllst.

    Wenn du diese Funktion nun 3mal aufrufst, wird das Ergebnis des ersten
    Aufrufes gelöscht, usw. Daher bringt es auch nicht viel, diese
    Funktion mit einem mutex zu sichern.

    Wenn du eine solche Funktion benötigst, würde ich für jeden Thread
    einen Speicherbereich für Strings anlegen, in diesem Speicherbereich
    den String zusammenbauen und den Pointer aus diesem Bereich zurückgeben.

    Mit pthread_key_t kannst du eine Art "globale Pointer" für jeden Thread
    speichern. Diese wäre dann hier sicherlich sinnvoll zu benutzen und ganz
    auf static zu verzichten.

    Genau einen solchen Ansatz hatte ich vor ein paar Jahren in einem Projekt
    umgesetzt. Es funktioniert einwandfrei.

    Gruß mcr





  • benutz lieber mal ein paar jahre noch keine threads, bis du verstanden hast was du machst und es richtig schreiben kannst.



  • danke mcr für die konstruktive Antwort.


Anmelden zum Antworten