syncloock grundlegende arbeitsweise

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Rattenfänger.

    syncloock grundlegende arbeitsweise

    Hallo ich habe mal ne grundlegende frage zum befehl synclook.
    wenn ich diesen befehl nutze, sind die darauffolgenden threads / envents in warteschleife oder werden die nur geblockt?

    Gruß
    Auch wenn ungetestet: Da dürfte die Primärinfoquelle genug Info geben:

    MSDN schrieb:

    When a thread reaches the SyncLock statement, it evaluates the lockobject expression and suspends execution until it acquires an exclusive lock on the object returned by the expression.
    Also: Däumchen drehen, bis Synclock wieder freigegeben ist. Ein Thread ist ja immer an einem Ausführungspunkt im Code. Und er kann ja nicht einfach so den Block überspringen und so tun, als ob er nicht da wäre, nur weil er durch synclock blockiert wird und später irgendwann, wenn er freigegeben ist, spontan wieder dahin zurückspringen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Rattenfänger schrieb:

    in warteschleife oder werden die nur geblockt?

    Nur geblockt. Keine Warteschlange. Wenn du z.B. 5 Thread auf ein synclook laufen lässt, dann kann es sein das nur 2 wirklich rein laufen und sich immer abwechseln und die anderen 3 kommen gar nicht dran. Oder auch nur einer läuft immer wieder rein. Bei einem synclook wartet der Thread nur kurz und probiert es dann nochmal. Mit entsprechen viel Pech ist ein anderer immer schneller. Je nach Szenario solltest du dir vielleicht etwas zu Lock Convoy durchlesen.

    Rattenfänger schrieb:

    warteschleife
    ungleich

    Bluespide schrieb:

    Warteschlange
    (Queue, also mit Reihenfolge) Ich hab's vorhin mal ausprobiert. Das ist scheinbar* zufällig, welcher der nächste ist:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Threading
    2. Public Class FrmMain
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim threads(9) As Thread
    5. Dim Knock As New KnockKnockOnTheBlock
    6. For i = 0 To threads.Count - 1
    7. Dim j = i
    8. Dim t As New Thread(New ThreadStart(Sub() Knock.GoToBlock(j)))
    9. threads(i) = t
    10. Next
    11. For Each t In threads
    12. t.Start()
    13. Next
    14. End Sub
    15. End Class
    16. Class KnockKnockOnTheBlock
    17. ReadOnly thisLock As New Object
    18. Public Sub TryToEnterTheBlock(ID As Integer)
    19. Console.WriteLine($"ID {ID} waits in front of the block")
    20. SyncLock thisLock
    21. Console.WriteLine($"ID {ID} is in the block")
    22. Threading.Thread.Sleep(10)
    23. Console.WriteLine($"ID {ID} leaves the block")
    24. End SyncLock
    25. End Sub
    26. Public Sub GoToBlock(ID As Integer)
    27. For i = 0 To 5
    28. TryToEnterTheBlock(ID)
    29. Next
    30. Console.WriteLine($"ID {ID} leaves the county")
    31. End Sub
    32. End Class


    *da gibt's bestimmt ne Möglichkeit rauszufinden, wer tatsächlich der nächste ist, aber der Aufwand wäre wohl overkill.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    also welcher thread der nächste ist mir echt wurscht, da es um dateneingabe in rows geht. Hier wird Row für Row durchgearbeitet und es wird gewartet bis alle threads durch sind. Für mich ist halt nur wichtig das alles eingetragen wird.