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.