Threads synchronisieren oder auch nicht?



  • Ich hab momentan eine Denksportaufgabe. Zwei Threads werden durch zwei Events gestartet und laufen danach asynchron weiter. Die Events kommen von der Hardware und man kann nicht sagen welches Event als erstes eintritt. Die maximale Verzögerung liegt irgendwo bei 40 ms.

    Was ich also bräuchte wäre eine Möglichkeit das Thread A vor der ersten Ausführung wartet bis Thread B auch soweit ist und umgekehrt. Allerdings frag ich mich ob das überhaupt geht und ob das überhaupt Sinn macht. Was passiert zum Bleistift wenn Thread A auf Thread B wartet und es tritt ein zweites Event auf das Thread A startet? Wird das dann irgendwo in eine Warteschlage eingereiht und ich hinke den Events hinterher oder wird es womöglich verworfen?



  • Also willst du, dass zuerst beide Thread einmal ein Signal erhalten müssen, bevor sie beide loslaufen sollen?



  • Was ich also bräuchte wäre eine Möglichkeit das Thread A vor der ersten Ausführung wartet bis Thread B auch soweit ist und umgekehrt.

    Sowas nennt man wohl Deadlock. 😃 😃 😃



  • Ich geb mal ein Beispiel:
    Event A tritt zuerst ein das stößt Thread A an. Thread A wartet, weil Thread B noch nicht gestartet wurde. 20 ms später -> Event B tritt ein Thread B wird angestoßen. Thread A und B laufen "gleichzeitig" los (auf ein paar Nanosekunden kommt es nicht an).

    Das ganze sollte natürlich auch funktioniern wenn mal Event B zuerst eintritt. Wenn nie eines der beiden Events eintritt wird schon vorher abgebrochen.



  • Redhead schrieb:

    Sowas nennt man wohl Deadlock. 😃 😃 😃

    Um das zu vermeiden wirst du wohl einen dritten Steuerthread benutzen müssen, der die beiden Events abfängt und dann per Signal die beiden "Arbeits-Threads" weckt.



  • Hmmm das Problem ist ich erstell diese Threads nicht selber, sondern hab eine Lib die auf diese Events hookt und für jedes einen einzelnen Thread erstellt. Da hab ich nur beschränkt Einfluss drauf, ich kann die Hooks anlegen und dann Code schreiben der beim Event x ausgeführt werden soll.



  • Ich weiß jetzt nicht genau, was du noch machen kannst, aber evtl. hast du die Möglichkeit mit WaitForMultipleObjects auf beide Events zusammen zu warten und dann erst die beiden Threads aktivieren 🙂


Anmelden zum Antworten