我可以从没有锁定的不同线程中读取内存缓冲区吗?

时间:2018-04-20 21:42:48

标签: c++ multithreading locking

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

我知道写作时,我们应该确保只有一个线程可以写入,但是读取的情况是什么?

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

所以事情就这样发生了:

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

3 个答案:

答案 0 :(得分:1)

  

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

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

当您有一个或多个编写者试图修改某个对象时,或者如果您有一个或多个编写者试图修改某个对象而另一个或多个读者试图读取其值时,您只需要同步。

答案 1 :(得分:0)

如果多个线程正在读取缓冲区,并且没有任何线程正在写入缓冲区,那么并发读取通常不是问题。例如,如果在创建线程之前填充缓冲区,并且从未更改过,那么读取可以是并发而无需锁定。

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

答案 2 :(得分:-1)

  

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

没有

但如果之前的写入比你的线程更多,那么,根据你所使用的机器,后面的读取可能会返回不同的值。