同时从多个线程访问只读数据是不是明智?

Posted

技术标签:

【中文标题】同时从多个线程访问只读数据是不是明智?【英文标题】:Is it wise to access read-only data from multiple threads simultaneously?同时从多个线程访问只读数据是否明智? 【发布时间】:2011-04-13 00:13:24 【问题描述】:

我有一个我正在尝试制作多线程的应用程序。每个线程都会访问一大块只读数据。

如果多个线程同时访问数据可以吗?我知道如果数据不是只读的,我需要使用互斥锁或其他形式的同步来防止竞争条件。但我想知道是否可以读取数据而不考虑同步。

所有个线程的持续时间内,相关数据不会被修改。该应用程序将在 Linux 和 Windows 上运行,并且使用 C++ 编写,如果这有什么不同的话。

【问题讨论】:

虽然已经给出了一般性答案,但我想添加一个警告。如果资源是数据库,请小心。见这里:***.com/questions/13912489/… 也许关键问题是即使只读是线程安全的,性能是否会受到影响。假设 100 个线程正在从多个随机索引的 10000 个元素的向量中读取。 【参考方案1】:

如果数据在读取它的所有线程的生命周期内都是只读的,那么是的,无需同步即可读取。

【讨论】:

我觉得你比我快 6 秒 @Thomas:正要在你的答案上发布:P 大声笑:D 我看到你们在这里做了什么!【参考方案2】:

如果在多线程访问期间数据确实是只读的,则不需要同步。

【讨论】:

【参考方案3】:

是的,没关系。

你应该没有任何问题。

【讨论】:

【参考方案4】:

如果数据在任何读取线程开始之前就已修复,那么是的,没关系。

【讨论】:

以上是关于同时从多个线程访问只读数据是不是明智?的主要内容,如果未能解决你的问题,请参考以下文章

共享锁排他锁重入锁锁的公平与非公平

深入理解读写锁—ReadWriteLock源码分析

ReentrantReadWriteLock场景应用

ReentrantReadWriteLock详解

Java多线程ReentrantReadWriteLock

读写锁 ReentrantReadWriteLock