Multithreading: Frage bzgl. Synchronisationspunkt



  • Hallo,

    ich habe zwei Threads, die ich gerne synchronisieren würde. Dabei sieht es so aus, das Thread 1 unabhängig vor sich hinrechnet und Thread 2 genauso. In ganz seltenen Momenten möchte T2 den T1 kurz updaten (aktualisieren einer Variable).
    Das wichtige ist: T1 soll dies mitbekommen, da T1 anschließend diese Variable einmalig in Berechnungen einfließen lassen soll.
    Ich hab irgendwie an einen Synchronisationspunkt gedacht. Sowas wie folgendes:

    T2 möchte T1 updaten und ruft dafür eine Methode auf und wartet jetzt solange, bis T1 dies mitbekommen hat und jetzt abwartet und nichts mehr rechnet.

    Dann schreibt T2 seine Daten in T1 und weckt T1 auf.

    T1 hat jetzt mitbekommen, dass T2 etwas verändert hat und beginnt sofort nach dem Aufwecken damit, die neuen Daten einmalig zu verwerten.

    -----------------
    Ich häng da gedanklich... vor allem wie T1 mitbekommt, dass T2 etwas verändert hat. Geht das mit einer ConditionVariable? Hat jemand Pseudocode? Danke :schland: 🙂



  • signals?



  • Reicht da nicht einfach ein atomic_int oder sowas?



  • cooky451 schrieb:

    Reicht da nicht einfach ein atomic_int oder sowas?

    T1 muss aber mit den geänderten Werten gewisse DInge neu berechnen. Er muss also mitbekommen, wenn z.B. die int-variable von T2 geändert wurde.

    Wie genau ist das mit den Signals gemeint? Falls es hilft: Ich arbeite mit boost-thread



  • mit boost hab ich noch nichts gemacht, hab aber mal kurz gegoogelt und gesehen das es signals auch in boost gibt. da ich schon länger nicht mehr mt programmiert hab mal sehen ob ichs ausem kopp noch hinbekomme (wenn nicht bitte "zurechtweisen")

    grundgedanke:

    du hast nen bereich in den t2 seine daten ablegen kann und der von t1 gelesen wird sobald hier was neues drinsteht. ansonsten rechnet t1 vor sich hin und t2 auch. jetzt hat t2 neue daten, schreibt diese an die stelle und gibt t1 ein "signal" das er sich bei nächster gelegenheit neue daten holen soll. das signal kommt asynchron bei t1 an. deshalb muss der nicht auf irgendwas prüfen sonder führt dann halt die "lese - operation" auf die daten aus. unter linux kann man sowas mit signals machen (z.b. sigusr01 oder so). in boost wird der mechanismus wohl ähnlich funktionieren. wahrscheinlich musst du aber auch die "speicherstelle" noch übern nen mutex syncen sichern.



  • Faden schrieb:

    T1 muss aber mit den geänderten Werten gewisse DInge neu berechnen. Er muss also mitbekommen, wenn z.B. die int-variable von T2 geändert wurde.

    GlobalerWert!=LokalerWert
    

    sollte doch reichen? du wirst doch eh eine stelle haben wo sich dein T2 befinden wird um auf den neuen wert zu reagieren, du kannst genau so periodisch den lokalen und globalen wert abgleichen.


Anmelden zum Antworten