.net - 使用互锁

标签 .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

似乎有可能,那我应该使用 Interlocked.Read()或将整个事物锁定在一个街区中?

最佳答案

是的,有一种可能性:

  • 线程 1 运行 Threading.Interlocked.Increment(hitCount)
  • 线程 2 运行 Threading.Interlocked.Increment(hitCount)
  • 线程 1 运行 Return hitCount
  • 线程 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
    

    关于.net - 使用互锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2230874/

    相关文章:

    .net - 将 JObject 转换为强类型对象

    javascript - 按需加载图像而不改变 src 属性

    php - PHP 有线程吗?

    java - 两个线程如何进入两个持有同一对象锁的同步块(synchronized block)

    c++ - 为什么 x86-64 C/C++ 编译器没有为此代码生成更高效的汇编?

    c - 避免线程间竞争条件的彼得森算法

    .net - Linq to Sql - 查找祖先的分层查询

    c# - 如何在 C# 中通过 shell 执行文件?

    c# - 如何知道我的 .net 应用程序正在哪个浏览器上运行?

    当 null 存在时,SQL 查询返回 null 而不是 SUM