Bil*_*l W 3 .net c# multithreading thread-safety
我有一些遗留代码使用Interlocked.Equals来比较值.值可以是两个bool,也可以将结构数组与null进行比较.Resharper抱怨Interlocked.Equals说"通过派生类型访问类型的静态成员".我知道Equals不是Interlocked类的成员,而是对象类的成员.比较发生在一个线程中,所以我假设原始编码器想要进行比较作为原子操作因此使用Interlocked.既然object.Equals不是原子的,那么进行这些比较的正确,线程安全的方法是什么?注意,大多数数据是静态的,有些是静态的.
你不能把整个比较原子化,但它并不是你真正感兴趣的原子性.我怀疑它是波动性.这就是确保当你读一个值,你肯定获得最新版本,而不是看它的值是在过去的某个点有效,但可能不是.如果你真的需要读/读/比较部分的原子性,我怀疑你需要锁定.
您可以使用Interlocked.CompareExchange以确保您正在阅读最新的值.
你绝对必须首先使用无锁线程吗?我强烈建议在更大的结构(例如,并行扩展)之上构建或者仅使用锁用于共享数据(无论如何应该尽可能避免).
单个读取布尔值或对象引用是原子的.因此,如果您将一个共享值与常量或局部变量进行比较,则不需要"互锁".正如Jon所说,Interlocked.CompareExchange除非共享变量是,否则您需要使用以确保您正在读取写入的最新值volatile.
如果两个比较共享,那么您将需要一个实际的锁定.没有办法原子地比较两个共享值AFAIK.
更新:
我建议为共享数据引入显式锁.请记住,原始代码已完全破坏,因此不要羞于更改它.
如果你考虑一下,你会对比较的结果做些什么?它没有意义; 一旦你得到结果,它可能是错的.锁定需要保持的时间长于比较比较对任何事物都有用的比较.
| 归档时间: |
|
| 查看次数: |
5943 次 |
| 最近记录: |