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?

War es hilfreich?

Lösung

Ja, es gibt eine Möglichkeit:

  1. Thread 1 läuft Threading.Interlocked.Increment(hitCount)
  2. Thread 2 läuft Threading.Interlocked.Increment(hitCount)
  3. Thread 1 läuft Return hitCount
  4. 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
scroll top