我可以在没有任何锁的情况下从不同的线程读取内存缓冲区吗?
Can I read a memory buffer from different threads without any lock?
假设我有一个内存缓冲区,不同的线程想要读取它(所以没有改变它(我是否需要一个锁来保护它免受并发读取?
我知道对于写入,我们应该确保只有一个线程可以写入它,但是读取时的情况如何?
澄清一下,缓冲区是一个表,多个线程可以读取并使用它,但它是在程序开始时和任何线程启动之前从磁盘读取的常量表。
所以事情是这样发生的:
- 程序开始
- 程序从磁盘读取表值。
- 程序创建线程并将数据传递给它们。 不同的线程通过读取此表和其他一些数据
- 来处理数据并生成一些数据,但没有线程更改此表。
- 程序完成。
假设我有一个内存缓冲区,不同的线程想要读取它(所以没有改变它(我是否需要一个锁来保护它免受并发读取?
只要您在填充缓冲区后执行此读取,则不,您不需要任何同步。 只要您只从同一对象读取,就不需要同步。
仅当有一个或多个编写器尝试修改对象,或者有一个或多个编写器尝试修改对象,一个或多个读取器尝试读取其值时,才需要同步。
如果多个线程正在读取缓冲区,而没有线程正在写入缓冲区,则并发读取通常不是问题。 例如,如果在创建线程之前填充缓冲区,并且从未更改,则读取可以在没有锁的情况下并发。
如果任何线程正在修改缓冲区,则读取和写入都需要锁。 这对于防止写入干扰读取和写入是必要的 - 例如,防止在部分写入时读取缓冲区的情况。
我是否需要锁来保护它免受并发读取?
不。
但是,如果写入时间早于线程,则根据您所在的计算机,较晚的读取可能会返回不同的值。
相关文章:
- 全局变量 多读取器 一个写入器多线程安全?
- 静态 constexpr 类成员变量对多线程读取是否安全?
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 跨线程共享读取资源
- 对于 ~95% 写入/5% 读取线程安全的无序列图,有没有一个简单的解决方案?
- 多个线程可以读取同一个类成员变量吗?
- 如何组织从提升日志接收器进行线程安全读取?
- 如果由不同的线程写入 8 字节,那么现代英特尔 x86 上的 8 字节读取是否保证理智?
- 终止读取时阻止的线程 c++11
- 在以读取为主的多线程程序中,可以使用原子来减少锁定吗
- 多个 OpenMP 线程读取(而不是写入)共享变量的性能成本?
- 线程 1 从文件读取,就像线程 2 写入同一文件一样
- QTcpSocket 或 QSslSocket 是否会自动创建用于读取/写入的线程?
- 我们是否需要对多线程 x32 系统使用 lock 来读取或写入 uint32_t 变量
- 线程函数无法从堆上分配的缓冲区中读取字符
- 我可以在没有任何锁的情况下从不同的线程读取内存缓冲区吗?
- C++:一个写入器/多个读取器访问一个unordered_map线程安全
- C++:如何在线程中读取二进制文件并将其写入另一个线程?
- 我可以在没有静音的线程中读取线程中的bool变量
- 读取线程应用程序(linux,pthreads)中的文件大小时出错