Wie kann man mit "CreateThread(...)" einen Container austauschen?



  • Nein, nein, ich wollte mich gar nicht auf reinterpret_cast festlegen lassen 😃
    War nur ne Frage außerdem ist so weit ich weiß static_cast ein ganz kleines bischen schneller weil es schon beim kompilieren gecastet wird 🙂



  • static_cast ist in diesem Fall genauso schnell/langsam wie reinterpret_cast. Beides auf den meisten Plattformen ein NOP.



  • Okay alles klar, danke 🙂

    Aber noch ne kleine Frage:
    Ist die ID des Threads wichtig? Ich mach das so, dass ich die 'unsigned long id;' einfach uninitialisiert lasse. Ist das so richtig?



  • Die ID gibt dir sowieso das OS vor, das ist ein output Parameter.
    Von daher kannst du das ruhig uninitialisiert lassen.



  • Achso, deshalb ist dieser Parameter auch eine Referenz 💡
    In Ordnung, danke an alle 🙂



  • Referenz

    Eher ein Zeiger 😉



  • Mal zum Thema Thread-sicheres Programmieren unter Windows:

    ich entwickel zur Zeit ein 2D Spiel unter Windows.
    Da ich dort für jeden BOT ein Pathfining-System anwende - welches natürlich viel Zeit in Anspruch nimmt (für jeden BOT ca. 0.1 Sekunden) - mache ich das für jeden BOT in einer Thread Funktion.
    Diese Thread Funktion läuft dann nur ca. 0.1 Sekunden, bei 100 BOTs laufen dann natürlich 100 Threads aber dafür eben nur sehr kurz.

    Was ich wissen möchte ist: was muss man machen (welche Funktionen der WinAPI sind notwendig) um das Programm Thread-sicher zu programmieren?

    Momentan stützten bei mir nur die Threads ab aber das Programm selbst läuft noch für ein paar Sekunden weiter. Dann kommt das bekannte "Fehler senden oder nicht senden" und schließlich terminiert Windows meine Anwendung komplett.

    Kennt sich jemand mit Thread-Programmierung unter Windows aus?

    Mfg Lukas



  • Kennt sich jemand mit Thread-Programmierung unter Windows aus?

    Ja, ich und einige andere.

    was muss man machen (welche Funktionen der WinAPI sind notwendig) um das Programm Thread-sicher zu programmieren?

    Das kann man so nicht sagen.

    Du musst erstmal verstehen was Threads eigentlich sind, und warum es zu Problemen kommen kann. Wenn du das mal raus hast kannst du anfangen nach Lösungen zu suchen oder zu fragen.



  • Nagut, dann frag ich einfach mal, ob es zu Fehler kommen kann, wenn ein Thread und das Hauptprogramm gleichzeitig auf eine Variable (z.B. boolean) zugreifen?

    Aber eigentlich sollte das ja kein Problem sein, denn einen boolean Variable auf 'true' oder 'false' zu setzten, entspricht doch auch nur einem Assembler Schritt, oder?!

    Was für mich aber auch wichtig währe: gibt es eine Funktion um im Hauptprogramm zu prüfen ob der Thread noch läuft oder schon beendet wurde.



  • ob es zu Fehler kommen kann, wenn ein Thread und das Hauptprogramm gleichzeitig auf eine Variable (z.B. boolean) zugreifen?

    Ja kann es.

    Aber eigentlich sollte das ja kein Problem sein, denn einen boolean Variable auf 'true' oder 'false' zu setzten, entspricht doch auch nur einem Assembler Schritt, oder?!

    Wenn dir der Compiler nicht mit irgendwelchen Optimierungen dazwischenpfuscht, und du auf einem x86 System arbeitest, dann geht es normalerweise. Wenn du auf anderen CPUs arbeitest kann es sein dass diverse Änderungen die Thread A macht erst *irgendwann* von Thread B "gesehen" werden. Auch kann es passieren dass Änderungen an z.B. 2 Variablen in der falschen Reihenfolge gesehen werden, also dass zuerst die 2. Änderung sichtbar wird und danach erst die 1. Änderung.

    Was für mich aber auch wichtig währe: gibt es eine Funktion um im Hauptprogramm zu prüfen ob der Thread noch läuft oder schon beendet wurde.

    Unter Windows: WaitForSingleObject() mit einem Timeout von 0. Mit PTHREADS kenne ich mich nicht so wirklich aus, müsste dir ein PTHREADS-Kenner beantworten.



  • informier dich mal über thread syncronisation und mutexe;) Es gibt im netz einige Thread Patterns (Active Object) .. hab da mal code gesehen das war einfach und übersichtich...



  • Noch 'ne kleine Anmerkung: Soweit ich weiß verursachen mit "CreateThread" erstellte Threads einen Leak von ~500 Bytes. Nicht tragisch, aber wenn du ständig neue Threads für die Bots erstellst, könnte sich das nach 'ner Zeit stark aufsummieren.
    Afaik heißt die Lösung dann "_begin_thread", weil da noch irgendwas getan wird, hm... was sich meiner Kenntnis entzieht... 😃

    edit: Und sowas wie eine kleine Regel zu gemeinsam von Threads verwendeten Variablen: Wenn alle Threads die gemeinsame Variable lesen ist das kein Problem, sobald mindestens einer schreibt, würde ich das Ganze mit Mutexen absichern. Für einfaches Mutex'ing verwende ich meist sf::Mutex mit sf::Lock aus der SFML-Bibliothek (http://www.sfml-dev.org/tutorials/1.3/system-threads.php, siehe weit unten).


Anmelden zum Antworten