c# - 保证变量的最新值始终对多处理器系统上的多个线程可见

标签 c# .net multithreading

我正在使用这样的配置:

  • .NET 框架 4.5
  • window 服务器 2008 R2
  • HP DL360p Gen8(2 * 至强 E5-2640,x64)

我的程序中某处有这样的字段:

protected int HedgeVolume;

我从多个线程访问这个字段。我假设因为我有多处理器系统,所以这些线程可能在不同的处理器上执行。

我应该怎么做才能保证在我使用这个字段时,最新的值是“read”?并确保当我“写入”值时它立即可供所有其他线程使用?

我该怎么办?

  • 保持原样。
  • 声明它volatile
  • 使用Interlocked类访问字段
  • 使用 .NET 4.5 Volatile.Read, Volatile.Write 方法访问字段
  • 使用

我只需要最简单的方法就可以让我的程序在此配置 上运行 我不需要我的程序在另一台计算机、服务器或操作系统上运行。此外,我想要最小延迟,所以我正在寻找最快解决方案,该解决方案将始终适用于标准配置(多处理器英特尔 x64、.net 4.5 ).

最佳答案

您的问题缺少一个关键要素...该字段中数据的完整性有多重要?

volatile 为您提供性能,但如果线程当前正在向该字段写入更改,则在完成之前您不会获得该数据,因此您可能会访问过时的信息,并可能覆盖更改另一个线程当前正在执行的操作。如果数据是敏感的,您可能会遇到很难跟踪的错误。但是,如果您正在进行非常快速的更新,在不读取值的情况下覆盖该值,并且不关心偶尔会得到过时(几毫秒)的数据,那就去做吧。

lock 保证一次只有一个线程可以访问该字段。您可以只将它放在写入字段的方法上,而不要管读取方法。不利的一面是,它很慢,并且可能会在另一个线程执行其任务时阻塞一个线程。但是,您确定您的数据保持有效。

Interlock 的存在是为了保护您自己免受调度程序上下文切换的影响。我的意见?除非您确切地知道为什么要使用它以及如何使用它,否则不要使用它。它提供了选择,但有很好的选择会带来很大的问题。它可以防止在更新变量时进行上下文切换。它可能不会像您认为的那样做,也不会阻止并行线程同时执行它们的任务。

关于c# - 保证变量的最新值始终对多处理器系统上的多个线程可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13050695/

相关文章:

java - 在页面卸载时终止 java applet 线程

c# - 当前给予排列的所有可能集合

c# - 仅当 listView 不为空时,如何才能激活/启用 contextmenustrip 菜单?

java - 如何在java中指定时间延迟后启动线程

java - Java 中线程中断的结果不可重复

c# - ExchangeServiceBinding 命名空间错误

c# - 如何创建命名引用类型的元组?

c# - 如何在编码模式下将超链接放入标签中?

c# - autofac 每个请求类型单个实例

.net - .NET SqlConnection 和 DataSet 的内存泄漏