Synchronisierung...



  • Hi!

    Mein Programm startet drei weitere Threads und wartet dann auf ein Event zum Beenden. Zwei dieser drei Threads sollen das Event signalisieren können.
    Aber SetEvent() ist doch nicht threadsafe...

    Wie soll ich das jetzt machen? Mit einer CriticalSection zwischen den zwei SetEvent() aufrufen?

    Also nochmal:

    - MainThread:
    CreateThread(threadHandle1);
    CreateThread(threadHandle2);
    CreateThread(threadHandle3);
    WaitForSingleObject(closeEvent, INFINITE);
    TerminateThread(thread1Handle);
    TerminateThread(thread2Handle);
    TerminateThread(thread3Handle);

    - Thread 1:
    while(true)
    recv(...);

    - Thread 2:
    WaitForSingleObject(processHandle1, INFINITE);
    SetEvent(closeEvent);

    - Thread 3:
    WaitForSingleObject(processHandle2, INFINITE);
    SetEvent(closeEvent);

    (Das Programm soll solange empfangen, bis sich mindestens ein Prozess schließt)

    So, also Thread 2 und 3 könnten doch gleichzeitig auf SetEvent() zugreifen.
    Was muss ich jetzt beachten? Hab sowas noch nie gemacht...
    Oder soll ich das ganz anders machen?

    Achja, noch was:
    Es heißt ja, TerminateThread() sei unsauber. Aber wie soll ich es denn sonst machen, sind schließlich alles blocking calls...

    Danke!


  • Mod

    Sicherlich ist SetEvent Threadsafe.
    Wieso denkst Du das es das nicht wäre?
    Was für eine Art von Event nutzt Du? Ich vermute mal das es ein manual-reset Event ist!

    Du setzt den Close Event und die anderen Threads "sollten" terminieren.

    BTW: Yet another reason to not use blocking sockets...



  • Warum sicher? Keine Ahnung, wo steht das?
    Ja, manual-reset, war nur einmal so dass der Prozess nicht mehr beendet hat und process explorer hat 0 threads angezeigt...


  • Mod

    Weil Crisitcalsections, Events und Mutexe die Kernfunktionen der Threadsynchronisation sind. Schau doch einfach in die MSDN! 🤡

    Du findest SetEvent in der Gruppe der Synchronisationsbefehle:
    http://msdn.microsoft.com/en-us/library/ms681924(VS.85).aspx
    Es steht auch in der Beschrebung, dass mehrere Threads auf einen Event warten können!

    Was glaubst Du denn, was passiert wenn SetEvent nicht threadsafe wäre?

    In Deinem Fal tut es sogar evtl. sogar eine Variable 😉



  • Ich dachte eben so, dass man SetEvent() eben zur Synchronisation verwendet, aber man SetEvent() SELBST auch noch synchronisieren muss 🙄

    Eine Variable? Das wäre doch nicht threadsafe 😮


  • Mod

    lobold schrieb:

    Ich dachte eben so, dass man SetEvent() eben zur Synchronisation verwendet, aber man SetEvent() SELBST auch noch synchronisieren muss 🙄

    Eine Variable? Das wäre doch nicht threadsafe 😮

    Warum ist das nicht threadsafe. Wenn Du nur etwas signalisieren möchtest wie Ende für alle Threads?
    Dann setzt Du das und jeder kann es abfragen und bekommt die gleicheInfo. Warum soll das nicht threadsafe sein?



  • Tja, dann habe ich zu wenig Wissen.
    Ich dachte, man müsse alle gleichzeitigen Zugriffe auf ein und dieselbe Variable absichern, also ne critical section setzen zB...


Anmelden zum Antworten