我可以在没有任何锁的情况下从不同的线程读取内存缓冲区吗?

Can I read a memory buffer from different threads without any lock?

本文关键字:读取 线程 内存 缓冲区 任何锁 我可以 情况下      更新时间:2023-10-16

假设我有一个内存缓冲区,不同的线程想要读取它(所以没有改变它(我是否需要一个锁来保护它免受并发读取?

我知道对于写入,我们应该确保只有一个线程可以写入它,但是读取时的情况如何?

澄清一下,缓冲区是一个表,多个线程可以读取并使用它,但它是在程序开始时和任何线程启动之前从磁盘读取的常量表。

所以事情是这样发生的:

  1. 程序开始
  2. 程序从磁盘读取表值。
  3. 程序创建线程并将数据传递给它们。
  4. 不同的线程通过读取此表和其他一些数据
  5. 来处理数据并生成一些数据,但没有线程更改此表。
  6. 程序完成。

假设我有一个内存缓冲区,不同的线程想要读取它(所以没有改变它(我是否需要一个锁来保护它免受并发读取?

只要您在填充缓冲区后执行此读取,则不,您不需要任何同步。 只要您只从同一对象读取,就不需要同步。

仅当有一个或多个编写器尝试修改对象,

或者有一个或多个编写器尝试修改对象,一个或多个读取器尝试读取其值时,才需要同步。

如果多个线程正在读取缓冲区,而没有线程正在写入缓冲区,则并发读取通常不是问题。 例如,如果在创建线程之前填充缓冲区,并且从未更改,则读取可以在没有锁的情况下并发。

如果任何线程正在修改缓冲区,则读取和写入都需要锁。 这对于防止写入干扰读取和写入是必要的 - 例如,防止在部分写入时读取缓冲区的情况。

我是否需要锁来保护它免受并发读取?

不。

但是,如果写入时间早于线程,则根据您所在的计算机,较晚的读取可能会返回不同的值。