Domanda

E 'questo codice thread-safe? o mettere in questo modo:

Esiste un modo per chiamare GetIt () e che GetIt () restituirà lo stesso numero a 2 fili diversi

Private Shared hitCount As Long = 1

Public Shared Function GetIt() As Long
     Threading.Interlocked.Increment(hitCount)
     DoSomethingQuick(hitCount)
     Return hitCount
End Function

Sembra come se fosse possibile, allora dovrei usare Interlocked.Read() o bloccare il tutto in un unico blocco?

È stato utile?

Soluzione

Sì, c'è una possibilità:

  1. della discussione 1 piste Threading.Interlocked.Increment(hitCount)
  2. della discussione 2 piste Threading.Interlocked.Increment(hitCount)
  3. della discussione 1 piste Return hitCount
  4. della discussione 2 piste Return hitCount

Nei passaggi 3 e 4, HitCount sarà lo stesso valore.

Ma la correzione è facile Interlocked.Increment restituisce il valore incrementato, quindi basta modificare il codice per:

Private Shared hitCount As Long = 1L

Public Shared Function GetIt() As Long
     Return Threading.Interlocked.Increment(hitCount)
End Function

Modifica O ora in base alla modifica, si dispone di un bel buco po 'i tempi. In ogni caso, questo è ciò che si vuole:

Public Shared Function GetIt() As Long
     Dim localHitCount As Long = Threading.Interlocked.Increment(hitCount)
     Console.Writeline("Something, something....")
     Return localHitCount 
End Function

Modifica Poi fare questo (che è esattamente ciò che Michael ha suggerito di seguito)

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top