使用联锁

dr.*_*vil 4 .net performance multithreading interlocked

这段代码是线程安全的吗?或者这样说:

无论如何调用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
Run Code Online (Sandbox Code Playgroud)

看起来这是可能的,那么我应该Interlocked.Read()在一个区块中使用或锁定整个东西吗?

shf*_*301 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
Run Code Online (Sandbox Code Playgroud)

编辑 或者现在根据你的编辑,你有一个很好的计时漏洞.无论如何,这就是你想要的:

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

编辑 然后这样做(这正是迈克尔在下面建议的)

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
Run Code Online (Sandbox Code Playgroud)