SyncLock写入?读?或两者?

时间:2011-01-07 01:16:33

标签: vb.net multithreading synclock

假设我有一个字节数组Private Data as Byte()。该数组在类中是私有的。该课程提供了阅读和写入Data的公共功能。

这个类可以被多个线程访问,所以我想避免一种情况,即从它读取并从中写入不会同时发生。

目前,我正在使用SyncLock来避免问题。我可以将SyncLock Data放入写入函数中,还是需要在读取函数中?或者,两者?

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

2 个答案:

答案 0 :(得分:5)

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

它旨在允许单个编写者,但允许多个读者。这通常适用于您所描述的情况。

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

答案 1 :(得分:4)

您想要锁定读取字节数组的主要原因是为了避免“幻读”或其他不可重复的读取 - 如果编写者在更新数组的过程中,读者可能会看到一些旧值和一些新值,或旧值,然后再读取新值。

例如,如果你有一个包含[1,2,3,4,5,6]的数组,并且一个编写器线程采用SyncLock并在数组上循环,每个元素加1,没有SyncLock的读者可能会看到像[2,3,4,4,5,6]这样的奇怪 - 只有实际接受SyncLock的线程才会获得任何安全性。

相关问题