Uso Interlocked
-
19-09-2019 - |
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?
Soluzione
Sì, c'è una possibilità:
- della discussione 1 piste
Threading.Interlocked.Increment(hitCount)
- della discussione 2 piste
Threading.Interlocked.Increment(hitCount)
- della discussione 1 piste
Return hitCount
- 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