Bra*_*rad 6 vb.net multithreading synclock
假设我有一个字节数组,Private Data as Byte()。该数组在类中是私有的。该类提供对进行读写的公共功能Data。
可以通过多个线程访问该类,因此我想避免发生一种情况,即不会同时发生读取和写入操作的情况。
目前,我正在使用SyncLock以避免问题。我可以SyncLock Data只放入写函数,还是必须在读函数中?或两者?
我没有特定的代码示例。我只是很好奇,如果写入功能的SyncLock首先使写入具有对其的独占访问权,那么锁定读取和写入功能是否有任何好处。
如果不使用的SyncLock的,你应该考虑使用ReaderWriterLockSlim(或ReaderWriterLock如果您在.NET 4中不是)。
它旨在允许一个作者,但可以有多个读者。对于您正在描述的情况,这通常是理想的选择。
否则,您可以使用SyncLock,但是您需要同时锁定读取和写入操作。如果没有两者都锁定,则在编写器仍在写入时,读者可能会读取数据-这将使您读取一半的数据。
您希望锁定读取字节数组的主要原因是为了避免“幻读”或其他不可重复读取 - 如果写入者正在更新数组,则读取者可能会看到一些旧值和一些新值,或者旧值,如果再次读取则使用新值。
例如,如果您有一个包含 [1, 2, 3, 4, 5, 6] 的数组,以及一个接受 a 并SyncLock在数组上循环并为每个元素添加 1 的编写器线程,则不这样做的读者可能SyncLock会看到类似的奇怪现象[2, 3, 4, 4, 5, 6] -- 只有实际使用的线程SyncLock才会获得安全性。