【发布时间】:2010-11-14 06:20:34
【问题描述】:
我有一个变量用来表示状态。它可以从多个线程中读取和写入。
我正在使用Interlocked.Exchange 和Interlocked.CompareExchange 来更改它。但是我正在从多个线程中读取它。
我知道volatile 可用于确保变量不在本地缓存,而是始终直接从内存中读取。
但是,如果我将变量设置为 volatile,那么它会生成一个关于使用 volatile 并将 using ref 传递给 Interlocked 方法的警告。
我想确保每个线程都在读取变量的最新值,而不是某个缓存版本,但我不能使用 volatile。
有一个Interlocked.Read,但它适用于 64 位类型,在紧凑框架上不可用。它的文档说 32 位类型不需要它,因为它们已经在单个操作中执行。
互联网上有一些声明说,如果您对所有访问都使用互锁方法,则不需要 volatile。但是,您无法使用 Interlocked 方法读取 32 位变量,因此您无法使用 Interlocked 方法进行所有访问。
有没有什么方法可以在不使用锁的情况下完成我的变量的线程安全读写?
【问题讨论】:
-
其实是个好问题。使用常规锁意味着一个关键执行点,并保证您的值对于所有线程都是最新的。但是,Interlocked.Exchange 没有使用
lock实现,我找不到任何参考说明它做出了这样的保证。