Happyman0815 Geschrieben 2. April 2009 Teilen Geschrieben 2. April 2009 Hallo Leute! Wenn ich mehrere Threads habe die in die Console etwas ausgeben, muss ich diese absichern. Meine Variante: EnterCriticalSection(&Cout); cout << "irgendwas\n" ; LeaveCriticalSection(&Cout); so und trotz dieser Absicherung crasht das Programm nach einiger Zeit. Nehme ich das cout raus, läuft es stabil. Hat jemand eine Idee? Gruß Happyman0815 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 2. April 2009 Teilen Geschrieben 2. April 2009 Benutzen denn alle Threads dieselbe Critical Section? Ansonsten bringt das gar nichts. Wie und wo ist Cout deklariert? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Happyman0815 Geschrieben 2. April 2009 Autor Teilen Geschrieben 2. April 2009 (bearbeitet) Also die Deklarationder Kritischen Bereiche ist Global: //Kritische Bereiche für Thread Synchronisation (Global) CRITICAL_SECTION File_opening; CRITICAL_SECTION use_obj; CRITICAL_SECTION Speed; CRITICAL_SECTION Cout; In der main() werden diese initialisiert: //Initialisierung der kritischen Bereiche InitializeCriticalSection(&File_opening); InitializeCriticalSection(&use_obj); InitializeCriticalSection(&Speed); InitializeCriticalSection(&Cout); Dann werden die Threads aus der main() aufgerufen: hspeed = CreateThread( NULL,NULL,Speed_,NULL,0,&dwThreadID); hmenu = CreateThread( NULL,NULL,Menu ,NULL,0,&dwThreadID); for(i=0; i < 5 ;i++) { temp_me_bool[thread_count] = true; hThread[thread_count] = CreateThread( NULL,NULL,URLDownload,NULL,0,&dwThreadID); Sleep(10); thread_count++; } hausgabe = CreateThread( NULL,NULL,Ausgabe ,NULL,0,&dwThreadID); In diesen Threads gibt es wie gesagt Ausgaben. Diese werden mit den "CriticalSection" umschlossen. EnterCriticalSection(&Cout); cout << " Irgendwas " ; LeaveCriticalSection(&Cout); So und jetzt geb ich mal etwas Code aus dem Ausgabe Thread Preis: while(run) { //Sleep(50); time ( &rawtime ); timeinfo = localtime ( &rawtime ); time_ = asctime(timeinfo); for(i=0;i<24;i++){timestand[i] = time_[i];}; for(i=0; i < 7; i++) code_[i]='\0'; EnterCriticalSection(&use_obj); f.get_hex_code(code_); LeaveCriticalSection(&use_obj); EnterCriticalSection(&Speed); temp_zaehler = zaehler; temp_speed = speed; temp_funde = funde; LeaveCriticalSection(&Speed); // if( getch()=='a'){ EnterCriticalSection(&Cout); cout << "\r\rZaehler: " << temp_zaehler << " Funde: " << temp_funde <<" Time: " << (string)timestand << " Code: "<<code_[0] <<code_[1]<<code_[2]<<code_[3]<<code_[4]<<code_[5]<<code_[6] << " Speed: " << temp_speed << " pro min bei "<< thread_count << " Threads" << " \r\r" ; LeaveCriticalSection(&Cout); // }else Sleep(2000); } Das cout in der oberen "Endlosschleife" macht Probleme. Die globalen Variablen die ich ausgebe werden vorher in temporäre lokale Variablen gepackt. Das lesen der globalen Variablen ist auch mit Kritischen Bereichen abgesichert. Am Ende des Programms werden die kritischen Bereiche in der main() wieder deletet: DeleteCriticalSection(&File_opening); DeleteCriticalSection(&use_obj); DeleteCriticalSection(&Speed); DeleteCriticalSection(&Cout); Gruß Happyman0815 Bearbeitet 2. April 2009 von Happyman0815 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 2. April 2009 Teilen Geschrieben 2. April 2009 Also die Deklarationder Kritischen Bereiche ist Global:Das ist soweit in Ordnung. Dann werden die Threads aus der main() aufgerufen:Wenn du in deinen Threads Funktionen der C-Laufzeitbibliothek benutzt, solltest du _beginthreadex benutzen, nicht CreateThread. So und jetzt geb ich mal etwas Code aus dem Ausgabe Thread Preis:Die Funktion asctime ist nicht threadsicher, weil sie immer wieder denselben Puffer zurückgibt. Aus so einem Codefragment kann man nicht ablesen, was sonst noch unsicher sein könnte, weil da jede Menge Variablen sind, deren Typ und Scope nicht klar ist. Das cout in der oberen "Endlosschleife" macht Probleme.Was heißt denn "macht Probleme"? Fehlermeldung? Was sagt der Debugger? Synchronisierungsprobleme machen sich nicht zwangsläufig da bemerkbar, wo sie verursacht werden. Du kannst das nicht absichern, indem du das Programm zum Test laufen lässt und da, wo es knallt, eine CritSec drumherum packst. Am Ende des Programms werden die kritischen Bereiche in der main() wieder deletet:Wie stellst du sicher, dass die Threads dann auch wirklich beendet sind? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Happyman0815 Geschrieben 6. April 2009 Autor Teilen Geschrieben 6. April 2009 Hallo! mein kleines Übungsprojekt musste ein paar Tage ruhen... Das ist soweit in Ordnung. Wenn du in deinen Threads Funktionen der C-Laufzeitbibliothek benutzt, solltest du _beginthreadex benutzen, nicht CreateThread. Das habe ich jetzt gemacht! Der Test läuft gerade. Bis jetzt kommen aber keine Fehler! Die Funktion asctime ist nicht threadsicher, weil sie immer wieder denselben Puffer zurückgibt. Ok zum Glück habe ich asctime nur in einem Thread laufen, daher sollte das ok sein. Was heißt denn "macht Probleme"? Fehlermeldung? Was sagt der Debugger? Es gibt zu Laufzeit Fehler. Der Debugger hatte da nichts zu meckern. Wie gesagt bis jetzt läuft der Test fehlerfrei. Wie stellst du sicher, dass die Threads dann auch wirklich beendet sind? Bis jetzt warte ich ein paar Sekunden bis ich die Sektions in der main() delete, so das die main() als letztes zu geht. Ich denke da muss ich die Handels alle mal abfragen und das davon abhängig machen. Das unschöne Projekt(den Quellcode werde ich jetzt nicht mehr schön machen :schlaf:) habe ich mal hochgeladen. Es ist zwar recht sinnlos aber es diente halt zu Übungszwecken. Erklärung: Damit das ganze funktioniert, sollte die Verknüpfung in Form eines Baum auf die .exe gelinkt sein. Die options.ini enthält eine Hompage die ausgelesen wird und den hexcode der am ende der HP dranhängt. Im Prinzip ist die bsp. HP ein Spambetreiber. Der Code dient der Abmeldung von Userkonten. Abmelden tut das Programm jedoch zurecht nicht. Die E-Mails hinter den Codes werden allerdings ausgelesen und abgespeichert. Es werden dafür zwei .txt Dateien im Ausführungsordner erstellt. PS: Auch ein kleiner Hieb in sachen Datensicherheit... Gruß Happyman0815 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 7. April 2009 Teilen Geschrieben 7. April 2009 Ich habe den Anhang entfernt, um mögliche rechtliche Folgen sowohl fürs Board als auch für dich zu vermeiden. Soweit ich das erkennen konnte, ruft das Programm mit unklarem Zweck eine große Datenmenge von einer Website ab. Ich zweifle die Wirksamkeit so eines "Mass-Unsubscribers" an. Es lässt sich serverseitig sehr einfach feststellen, dass alle Austragungen kurz hintereinander vom selben Client kamen. Das lässt sich relativ leicht filtern. Grundsätzlich solltest du darauf achten, dass keine "Ziel"-URLs erkennbar sind, wenn du derartige Programm hochlädst. Außerdem kannst du auf folgende Dateien verzichten:Das erstellte ausführbare Programm. Das wird hier sowieso niemand starten Den gesamten Debug- und/oder Release-Ordner. Wer will, kann sich das selbst bauen.Dateien mit der den Endungen .ncb, .opt, .plg, .suo Damit schrumpft dein Archiv gleich von über 1 MByte auf knapp 12 KByte. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Happyman0815 Geschrieben 7. April 2009 Autor Teilen Geschrieben 7. April 2009 Ich habe den Anhang entfernt, um mögliche rechtliche Folgen sowohl fürs Board als auch für dich zu vermeiden. Ja, wenn ich weiter darüber nachdenke ist das auch gut so... Ich zweifle die Wirksamkeit so eines "Mass-Unsubscribers" an. Es lässt sich serverseitig sehr einfach feststellen, dass alle Austragungen kurz hintereinander vom selben Client kamen. Das lässt sich relativ leicht filtern. Ja es lässt sich filtern und ich glaub auch nicht, dass die Daten mit einer Abmeldung gelöscht werden... Ich glaube Lycos hatte mal einen Bildschirmschoner herausgegeben, der bei inaktivität des Users irgendwelche Bilder von Spammails heruntergeladen hat. Die erhöhte Traffic sollte den Betreiben somit mehr Geld kosten und die Werbung damit uninteressant machen. Ich weiß jetzt leider nicht wie die Geschichte ausging aber das Projekt wurde meines wissens nach eingestellt. Grundsätzlich solltest du darauf achten, dass keine "Ziel"-URLs erkennbar sind, wenn du derartige Programm hochlädst. Außerdem kannst du auf folgende Dateien verzichten:Das erstellte ausführbare Programm. Das wird hier sowieso niemand starten Den gesamten Debug- und/oder Release-Ordner. Wer will, kann sich das selbst bauen.Dateien mit der den Endungen .ncb, .opt, .plg, .suo Damit schrumpft dein Archiv gleich von über 1 MByte auf knapp 12 KByte. Werde ich beim nächsten mal beherzigen. Danke für die Wissensvermittlung in Sachen Threads Klotzkopp!!! Hat mich um einiges weiter gebracht! Gruß Happyman0815 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.