4

このコードはスレッドセーフですか?またはこのように言います:

GetIt()を呼び出す方法はありますか?GetIt()は2つの異なるスレッドに同じ番号を返します

Private Shared hitCount As Long = 1

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

それは可能だと思われInterlocked.Read()ますが、すべてを1つのブロックで使用またはロックすることになっていますか?

4

1 に答える 1

10

はい、可能性があります:

  1. スレッド1の実行Threading.Interlocked.Increment(hitCount)
  2. スレッド2の実行Threading.Interlocked.Increment(hitCount)
  3. スレッド1の実行Return hitCount
  4. スレッド2の実行Return hitCount

手順3と4では、hitCountは同じ値になります。

ただし、修正は簡単です。Interlocked.Incrementはインクリメントされた値を返すため、コードを次のように変更するだけです。

Private Shared hitCount As Long = 1L

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

編集 または今あなたの編集に基づいて、あなたはかなりのタイミングの穴があります。とにかく、これはあなたが望むものです:

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

編集 次にこれを行います(これはまさにマイケルが以下に提案したことです)

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
于 2010-02-09T17:21:11.293 に答える