C#multithreading:获取读锁必要?

在从多个线程读取variables之前是否需要获取variables的locking?

简短的答案是:这取决于。

长的答案是:

  • 如果它不是共享值,即只有一个线程可以看到(或使用它),则不需要任何同步。

  • 如果它是一个不可变的值,也就是说,只设置了一次,然后才读取,那么在没有同步的情况下这样做是安全的(只要在第一次写入完成之前没有开始读取)。

  • 如果它是一个最多32位(例如, byteshortint )的“原始”types,那么读取时可以得到陈旧(旧)的数据。 如果这不打扰你,你就定了。 如果陈旧的数据是不可取的,使variablesvolatile可以解决这个问题,没有额外的读取同步。 但是,如果你有赛车作家,你需要遵循以下相同的build议。

  • 如果它是比32位long的“原始”types(例如longdecimaldouble ),则需要同步,否则可以读取一个值的“half”,另一个值的“half”,并获得疯狂的结果。 为此,推荐的方法是使用Interlocked类中的方法读取和写入数据。

  • 如果它是一个引用types,你将需要同步,以避免看到一个无效的状态(杰夫羔羊的图片示例是一个很好的)。 lock声明可能就足够了。 同样,您需要locking读取和写入。

还有其他一些要考虑的事项(例如locking多久),但是我认为这些足以回答你的问题。

这取决于variables的types和你的平台。 例如,读取Int64s不能保证在32位机器上是primefaces的。 因此, Interlocked.Read

如果在1个汇编指令中加载该值,则不需要获取locking。 你不在乎10分钟前或1微秒前的值是否改变。 你现在只想要价值。

然而,如果你正在加载一个巨大的数组或图片或其他东西,那么将其locking出来可能是一个好主意。 从理论上讲,你可以在加载数据的时候先占先,第一个项目的一半和第二个项目的一半。

如果它是一个简单的variables,但是,像一个布尔或int,这是没有必要的。

除了下面的答案之外,您还可以使用ReadWriterLockSlim进行读取locking。

这将允许你在读取时只做一个读锁,在修改你的variables的时候写一个锁。 多个线程可以同时具有读取locking,但只要线程请求写入locking,所有新请求都将被阻止,直到完成为止。

如果你正在做大量的读取而不是很多的写入,这种locking将是有用的。

与大多数multithreading问题一样,研究它足以了解它是否真的适合您的问题,ReadWriterLock将不适合每个locking情况。

这取决于它是否是一个本地或共享的variables,是否有其他的东西可以写在它的同时,以及你读后做什么。

如果您根据variables做出决定,则考虑下一行代码可能基于现在已过时的数据。

阅读不需要locking; 只要你不关心阅读的“正确性”。 如果你试图无锁地写信,这只是危险的。

如果它是一个常数,不。

如果它是一个可更新的值,是的,如果你需要一致性。

对于必须pipe理确切值的可更新值,是的,您应该使用locking或其他同步方法进行读取和写入; 并可能在整个使用价值的范围内阻塞。

答案是取决于。 如果variables的值在线程访问variables时没有改变。 否则,它需要。

另外,您可以使用Interlocked.XXX系列在读取\写入variables时保持primefaces性。

必要? 没有。

…但是如果可能的话,另一个线程可能会在读取期间尝试写入(如集合等),那么这可能是一个好主意。

这是100%必要的,除非你100%确定variables的值在读线程运行时不会改变。

只要在其他线程执行期间不更改,则不需要将其locking。 如果改变,你应该使用它。

如果variables永远不会被某人写入(至less在可访问的时候),您不需要locking它,因为没有错过更新的可能性。 如果你不关心错过的更新也是一样(这意味着如果你得到一个较旧的值,这不是一个问题)。 否则,你应该使用某种同步