我想使用Thread.VolatileWrite()
(或等效函数)来更改T[]
字段的值,以便更新的值立即对所有其他线程可见.但是,该方法不提供通用版本,并且我无法使用Object
重载,因为它需要一个ref
参数.
还有其他选择吗?会Interlocked.Exchange
做这个工作吗?有没有更好的方法来实现我想做的事情?
VolatileWrite
仅在您也使用时有用VolatileRead
; 的volatile
修改更容易使用,但我不知道它会不会是简单的使用同步-也许是ReaderWriterLockSlim
(因为它听起来像是你有很多的读者).
Interlocked.Exchange
简单地执行get和set作为原子操作; 它不会(AFAIK)提出任何波动性声明(事实上,编译器甚至会告诉您一个volatile
字段volatile
在被用作ref
参数时不会被视为).
编辑澄清"它没有(AFAIK)做出任何波动性声明" - 行为Interlocked
是可预测的,你应该立即在其他线程上看到更新,只要它们也使用Interlocked
; 我的观点是,如果一个线程使用Interlocked
,而另一个线程依赖volatile
(与同一领域交谈),我不知道有任何保证.坚持所有访问的一个或另一个.