Mit Verschlungene
-
19-09-2019 - |
Frage
Ist dieser Code Thread-sicher? oder es so:
Gibt es trotzdem GetIt () aufzurufen, und dass GetIt () die gleiche Anzahl an 2 verschiedenen Threads zurückkehren
Private Shared hitCount As Long = 1
Public Shared Function GetIt() As Long
Threading.Interlocked.Increment(hitCount)
DoSomethingQuick(hitCount)
Return hitCount
End Function
Es scheint, wie es möglich ist, dann soll ich verwenden Interlocked.Read()
oder sperren Sie die ganze Sache in einem Block?
Lösung
Ja, es gibt eine Möglichkeit:
- Thread 1 läuft
Threading.Interlocked.Increment(hitCount)
- Thread 2 läuft
Threading.Interlocked.Increment(hitCount)
- Thread 1 läuft
Return hitCount
- Thread 2 läuft
Return hitCount
In Schritt 3 und 4, HitCount werden der gleiche Wert sein.
Aber die Lösung ist einfach Interlocked.Increment gibt den inkrementierten Wert, so dass nur Code ändern:
Private Shared hitCount As Long = 1L
Public Shared Function GetIt() As Long
Return Threading.Interlocked.Increment(hitCount)
End Function
Bearbeiten Oder jetzt auf der Grundlage Ihrer bearbeiten, haben Sie eine ziemlich Bittiming Loch. Wie auch immer, dann ist dies, was Sie wollen:
Public Shared Function GetIt() As Long
Dim localHitCount As Long = Threading.Interlocked.Increment(hitCount)
Console.Writeline("Something, something....")
Return localHitCount
End Function
Bearbeiten Dann tun dies (das ist genau das, was Michael unten vorgeschlagen)
Private Shared hitCount As Long = 1L
Public Shared Function GetIt() As Long
Dim localHitCount As Long = Threading.Interlocked.Increment(hitCount)
DoSomethingQuick(localHitCount )
Return localHitCount
End Function
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow