multi threading



  • Grüßt euch,

    ich bin dabei mich in das multithreading einzuarbeiten um meine Anwendung auf einem Mehrkernprzessor schneller ausführen zu können. Vorgestellt hab ich mir das so, das die Anwendung, inkl. Windows Nachrichtenschleife auf dem main thread ausgeführt wird und eine bestimmte Kalkulation parallel in einem zusätzlichen worker thread. Meine Fragen sind:

    Ich erstelle ja den worker thread über _beginthreadex und kann diesen dann mittels seines Handels vom main thread aus steuern. Wenn ich nun den mainthread vom worker thread aus suspenden möchte, brauch ich ja für den main thread auch einen handle oder ist das dann der Prozess Handle? Woher bekomme ich den handle, da ich den main thread ja nicht selber erstelle. Geht das überhaupt oder müsste ich meine gesamte Anwendung in einen worker thread legen und die Kalkulation in einen 2. Vielleicht noch die Nachrichtenschleife in einen 3. Zur Zeit ist es so, das meine Nachrichtenschleife nach jedem berechneten frame auf news überprüft wird. Das ist eigentlich ok.

    Die Notwendigkeit meinen main thread zu pausieren, ergibt sich nur darin, wenn der main thread einen gewissen Punkt überschritten hat und der worker thread mit seiner parallel berechneten Kalkulation noch nicht fertig ist. In diesem Fall soll der main thread erst weiter arbeiten, wenn der worker thread, seinen Schleifendurchlauf vollständig abgearbeitet hat.



  • naja, ich meine, wenns hilft, könntest du auch einen Join versuchen, aber dabei wird gewartet bis der Worker-Thread vollständig beendet ist.
    Ansonsten könntest du beispielsweise auch nen mutex schließen oder condition oder semaphore verwenden, welche du geeignet schließt / öffnest.



  • Da du unter Windows zu arbeiten scheinst, schau dir mal:
    - CreateEvent / SetEvent / ResetEvent / WaitForSingleObject
    - InitializeCriticalSection / EnterCriticalSection / LeaveCriticalSection

    Damit kannst du Thread synchronisieren / auf ein Ereignis warten lassen.
    Vielleicht bringt es dich weiter.

    Mit dem Thread Handle kannst du (relativ) wenig in der beziehung anfangen.
    Einen Thread solltest du über ein Flag beenden und nicht über einen "harten" Abbruch per TerminateThread oder ähnliches.



  • Ja mit CreateEvent + WaitForSingleObject konnte ich das handeln und suspend und resume thread verwerfen.

    Ich habe da noch eine weitere Frage in Bezug auf das synchrone Zugreifen von 2 threads auf die gleiche Ressource. Wenn 2 threads schreibend auf die Ressource zugreifen, sollte ein mutex her, klar. Wenn jedoch ein Thread lesend/schreibend und der andere nur lesend auf die Ressource zugreifen kann, ist dann eine Sicherstellung dafür, dass nur ein Thread zu einer Zeit auf die Ressource zugreifen kann, notwendig? Ich meine, wenn Thread 1 in die Ressource schreibt und Thread 2 die Ressource liest. Was kann passieren? Thread 2 liest den alten Wert der Ressource oder den neuen. Kann noch etwas anderes passieren, z.b. ein Wert ungleich des alten oder neuen Wertes wird gelesen oder ein Absturz der Anwendung?



  • Es kommt auf die Größe der Resource an. Wenn es nur ein Registerdatentyp ist, dann kann eigentlich nur der alte oder der neue Wert gelesen werden. Bei größeren Datentypen aber kann natürlich jede beliebige Kombination aus Altdaten und schon neu geschriebenen Daten entstehen, und das möchte man ja evtl. vermeiden.



  • werte werden meistens nicht instant (atomar) geschrieben, sondern dauern etwas.

    beispiel: eine zuweisung eines strings. Es muss jeder char kopiert werden - was passiert wenn der eine thread mitten im schreiben ist waehrend der andere zu lesen anfaengt?

    bei atomaren schreib operationen braucht man kein locking.



  • ok also wenn der Wert bit für bit neu gesetzt wird, könnte ich einen 3. Wert erhalten, der nicht der alte bzw. der neue ist.
    Oh man, dass sind etliche Variablen, die ich locken muss. Ich muss für jede Ressource einen eigenen mutex createn und mit diesen in beiden Threads mittels WaitForSingleObject und ReleaseMutex die Variablen umschließen ?



  • Um Variablen zu sperren kannst du EnterCriticalSection / LeaveCriticalSection nehmen.
    Das ist einfacher von der Umsetzung.

    Und dran denken, wenn du schon dabei bist für jede Variable eine Zugriffsfunktion zu machen. Vielleicht auch ein "Lock"-Template (oder Sync-Template) für den Zugriff.
    Da kann man schon schicke Sachen machen.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten