Multithreading 访问不会更改的全局数据时是否需要锁定?

Multithreading 访问不会更改的全局数据时是否需要锁定?,multithreading,Multithreading,在读取多线程代码中的数据时,我对何时使用锁感到非常困惑。我知道如果您正在读取全局数据并对其进行更改,则需要更改数据的线程锁定。但是,如果线程只是读取数据而没有进行任何更改,该怎么办?这种情况下也需要锁吗 如果您所做的只是写一次数据(比如在启动时),并且从那时起您将只读取数据,那么您不需要锁定。读取数据不会改变它,也不会以任何方式导致冲突 但是,如果有可能在存在活动读卡器的情况下修改数据,则必须通过锁定来防止这种情况,否则读卡器可能会读取一些半修改的数据(即乱码数据),因为写入程序可能会同时修改数

在读取多线程代码中的数据时,我对何时使用锁感到非常困惑。我知道如果您正在读取全局数据并对其进行更改,则需要更改数据的线程锁定。但是,如果线程只是读取数据而没有进行任何更改,该怎么办?这种情况下也需要锁吗

如果您所做的只是写一次数据(比如在启动时),并且从那时起您将只读取数据,那么您不需要锁定。读取数据不会改变它,也不会以任何方式导致冲突

但是,如果有可能在存在活动读卡器的情况下修改数据,则必须通过锁定来防止这种情况,否则读卡器可能会读取一些半修改的数据(即乱码数据),因为写入程序可能会同时修改数据


在这种情况下,可以使用比普通锁更好的机制。一个例子是读写器锁。这类对象允许您获取读锁或写锁。它允许多个同时读卡器通过获取读锁同时读取数据。但是,当您获取写锁时,任何其他获取锁的尝试(无论是读锁还是写锁)都将被阻止,直到写入程序完成并释放锁为止。这在允许并行读卡器的同时确保了数据的一致性。

因此,对于第二段,我是否需要锁定每次读取的数据,还是只在修改数据的地方读取数据?感谢您提供有关读/写锁的信息,我将不得不检查这些信息。如果您有可能同时读取和修改数据,那么是的,您需要读取和写入锁。我忘了提到,如果数据足够简单(比如一个int),也可以使用互锁操作,这是原子操作,即使在同时读写时也不需要锁定。但这只是供参考,我不想把你弄糊涂,因为这些更难正确。因此,在这一点上,只要保持基本(锁),直到你有足够的信心。并发很容易出错,请记住这一点,并采取安全的方式。我的代码在完成编写后将有少量写入和多次读取。我想我将使用您在第3段中提到的读/写锁。