我正在使用这样的配置:
- .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/