Hilfe bei Atomics benötigt



  • Shade Of Mine schrieb:

    das sieht dennoch wie eine Situation fuer einen Mutex aus.

    Wie kommst du darauf? Ich möchte nur überprüfen, ob ein Thread bereits schreibt, damit niemals zwei Threads gleichzeitig schreiben. Warum willst du da einen Mutex nehmen?



  • Kellerautomat schrieb:

    Shade Of Mine schrieb:

    das sieht dennoch wie eine Situation fuer einen Mutex aus.

    Ich möchte nur überprüfen, ob ein Thread bereits schreibt, damit niemals zwei Threads gleichzeitig schreiben.

    Wenn mich jemand fragt warum er einen Mutex verwenden soll, dann wuerde ich den Satz als Antwort gelten lassen 😉

    Ein Mutex ist dafuer da, dass ein Codeblock nicht von 2 Threads gleichzeitig ausgefuehrt werden kann. Du vergewaltigst hier atomics.



  • @Kellerautomat

    Lass die Finger von Threads, du tust dir damit nur heftig weh.



  • Shade Of Mine schrieb:

    Ein Mutex ist dafuer da, dass ein Codeblock nicht von 2 Threads gleichzeitig ausgefuehrt werden kann.

    Das mag schon sein, aber ich _kann_ und _will_ nicht warten. Mein Server verwendet einstellbar viele Threads, was bedeutet, dass ein blockierter Thread einen nicht mehr antwortenden Server zur Folge haben kann.


  • Mod

    Kellerautomat schrieb:

    Shade Of Mine schrieb:

    Ein Mutex ist dafuer da, dass ein Codeblock nicht von 2 Threads gleichzeitig ausgefuehrt werden kann.

    Das mag schon sein, aber ich _kann_ und _will_ nicht warten.

    ok.

    Kellerautomat schrieb:

    Mein Server verwendet einstellbar viele Threads, was bedeutet, dass ein blockierter Thread einen nicht mehr antwortenden Server zur Folge haben kann.

    Ich verstehe nicht, wie das eine das andere implizieren soll. Kannst du das näher erläutern?



  • Okay, kleines Beispiel (es handelt sich um einen Chatserver, ähnlich IRC): User X befindet sich in Channel Y. Nun verlässt User A den Channel, User B joint, User C schreibt eine Nachricht in den Channel und User D schreibt X im Query an. Wenn eine der Operationen unerwartet lange blockiert, sind alle anderen Threads auch blockiert.



  • Wenn nur ein Thread schreiben kann, dann musst du blockieren. Denkst du mit atomics gehts schneller?

    Du koenntest einfach feiner locken. zB private Messages blockieren nicht den Main Channel und so.

    Aber atomics haben hier nichts zusuchen und zwar rein garnichts.


  • Mod

    Kellerautomat schrieb:

    Wenn eine der Operationen unerwartet lange blockiert, sind alle anderen Threads auch blockiert.

    Welche Operation?



  • Schreiben am Socket des Users X.



  • Kellerautomat schrieb:

    Schreiben am Socket des Users X.

    Dann brauchst du einen Mutex der diese eine Operation lockt.
    Fertig.
    User Y ist davon nicht betroffen.

    PS:
    du kannst gerne mal alles genauer erklaeren. Dann koennen wir dir sicher besser helfen.



  • Hab mal ein kleines ASCII-Art geschnitzt.

    t1                 t2                 t3                t4
    +------------------+------------------+-----------------+-------------------+
    | liest Quit von A | liest Join von B | liest Msg von C | liest Query von D |
    +------------------+------------------+-----------------+-------------------+
             |                |                        |                |
             |                |                        |                | 
             |                | warten          warten |                |
             |                +-------> +---+ <--------+                |
             +------------------------> | X | <-------------------------+
             informiert X, dauert lange +---+             warten
    


  • Wie stellst du dir das mit atomics vor dass dort kein Warten mehr stattfindet?



  • Ich werfe die anderen 3 Nachrichten in die Queue. Der Thread, der gerade an X sendet, bearbeitet dann diese weiteren 3 Nachrichten danach, während die anderen 3 Threads bereits wieder etwas anderes machen können.


  • Mod

    Kellerautomat schrieb:

    Ich werfe die anderen 3 Nachrichten in die Queue. Der Thread, der gerade an X sendet, bearbeitet dann diese weiteren 3 Nachrichten danach, während die anderen 3 Threads bereits wieder etwas anderes machen können.

    Aha. Also benötigt die Socketoperation gar keinen Mutex, nur der Zugriff auf die Queue synchronisiert werden. Dass kann nat. curch eine lockfreie Implementation geschehen, aber auch durch mutex. Jedenfalls sind Operationen auf einer Queue grundsätzlich nicht blockierend.
    Warum meinst du, die eigentliche Socket-Operation mit einem Mutex schützen zu müssen, darauf aber bei atomics verzichten zu können?



  • Ich habe da doch nirgens Mutexe. Die wollte SoM mir einreden.



  • Kellerautomat schrieb:

    Ich habe da doch nirgens Mutexe. Die wollte SoM mir einreden.

    OK.
    Wozu brauchst du hier atomics? Was erreichst du mit der Variable "writing"?

    PS:
    deshalb auch meine Bitte das ganze ordentlich aufzuzeichnen und nicht nur 3 Satz Posting zu machen 😉



  • Man könnte sagen, der Wert der Variable besagt, ob gerade ein Thread den Socket besitzt. Sprich:
    false -> Ich bin derjenige, der selbst schreiben muss.
    true -> Ein anderer schreibt gerade, ich kann das schreiben meiner Nachricht einfach an ihn delegieren.



  • OK, das musst du mehr erklaeren. Du sharest sockets zwischen mehreren threads?



  • Nein, eben nicht. Genau das verhindere ich doch mit der Variable.



  • Kellerautomat schrieb:

    Nein, eben nicht. Genau das verhindere ich doch mit der Variable.

    Du musst mehr erklaeren. Das was ich bisjetzt verstanden habe klingt furchtbar konfus. Bitte skizziere dein Design hier auf.

    Denn entweder verstehe ich dich nicht richtig oder mit deinem Design hats was gravierendes.


Anmelden zum Antworten