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

时间:2014-09-14 22:29:40

标签: multithreading

在使用多线程代码读取数据时何时使用锁,我感到非常困惑。我知道如果您正在读取全局数据并更改它,则需要从正在更改数据的线程锁定。但是如果线程只是读取数据而不进行任何更改呢?在这种情况下是否也需要锁?

1 个答案:

答案 0 :(得分:1)

如果您所做的只是编写一次数据(比如在启动时),那么从那时起您只能阅读它,那么您就不需要锁定了。读取数据不会改变它或以任何方式引起冲突。

但是,如果有活跃的读者有可能修改数据,你必须通过锁定来防止这种情况,否则读者可能会读取一些半修改过的数据(即乱码数据)可能会同时修改它。

对于这种情况,您可以使用比普通锁更好的机制。一个例子是读/写锁。通过这些对象,您可以获得读锁写锁。它允许多个同时读取器通过获取读锁来同时读取数据。但是当你获得一个写锁时,任何其他获取锁的尝试(无论是读锁还是写锁)都会阻塞,直到编写完成并释放锁。这确保了数据的一致性,同时允许并行读取器。