我想使用 Thread.VolatileWrite()
(或等效函数)来更改 T[]
的值字段,以便所有其他线程立即看到更新的值。但是,该方法不提供通用版本,我无法使用 Object
过载,因为它需要 ref
参数。
还有其他选择吗?会Interlocked.Exchange<T>
做这份工作?有没有更好的方法来实现我想做的事情?
最佳答案
VolatileWrite
仅当您还使用 VolatileRead
时才有用; volatile
修饰符更容易使用,但我想知道使用同步是否更简单 - 也许是 ReaderWriterLockSlim
(因为听起来你有很多读者)。
Interlocked.Exchange<T>
只需将 get 和 set 作为原子操作执行;它(AFAIK)没有做出任何波动性声明(实际上,编译器甚至告诉您 volatile
字段在用作 volatile
参数时不会被视为 ref
)。
编辑以澄清“它(AFAIK)没有做出任何波动性声明” - Interlocked
的行为是可预测的,您应该立即在其他线程上看到更新只要他们也使用 Interlocked
;我的观点是,如果一个线程使用 Interlocked
,而另一个依赖于 volatile
(与同一个领域交谈),我不知道有任何保证。对于所有访问,请坚持使用其中一个。
关于.net - 使用带有数组参数的 Thread.VolatileWrite(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/453232/