6

假设我有一个字节数组,Private Data as Byte(). 这个数组在一个类中是私有的。该类提供用于读取和写入的公共函数Data

这个类可以被多个线程访问,所以我想避免读取和写入不会同时发生的情况。

目前,我使用 SyncLock 来避免问题。我可以SyncLock Data只放入写入功能,还是需要放入读取功能?或两者?

我没有具体的代码示例。我只是好奇,如果写入函数的 SyncLock 将使写入首先具有对它的独占访问权限,那么锁定读取和写入函数是否有任何好处。

4

2 回答 2

5

您应该考虑使用ReaderWriterLockSlim(或ReaderWriterLock,如果您不在 .NET 4 中),而不是使用 SyncLock。

它旨在允许单个作者,但多个读者。对于您所描述的情况,这通常是理想的。

否则,您可以使用 SyncLock,但您需要锁定读取和写入操作。如果没有两者的锁定,您的阅读器可能会在编写器仍在写入时读取数据 - 这将导致您读取半集数据。

于 2011-01-07T01:25:32.623 回答
4

您希望锁定读取字节数组的主要原因是避免“幻像读取”或其他不可重复读取 - 如果写入器正在更新数组的中途,读取器可能会看到一些旧值和一些新值,或者一个旧值,如果它再次读取它,然后是新值。

例如,如果您有一个包含 [1, 2, 3, 4, 5, 6] 的数组,以及一个接受 aSyncLock并在数组上循环为每个元素添加 1 的写入器线程,则没有的读取器SyncLock可能会看到类似[2, 3, 4, 4, 5, 6] - 只有实际接受的线程SyncLock才会获得任何安全性。

于 2011-01-07T01:20:31.313 回答