g++-4.4(不在 C++11/14 中)通过 boost::shared_mutex 实现多读取器单编写器是否会影响
Does Multiple reader single writer implementation in g++-4.4(Not in C++11/14) via boost::shared_mutex impact performance?
用法:在我们的生产中,我们有大约 100 个线程可以访问我们尝试实现的缓存。如果缺少缓存,则将从数据库中获取信息,并通过编写器线程更新缓存。
为了实现这一目标,我们计划实施multiple read and single writer
我们无法更新 g++ 版本,因为我们使用的是g++-4.4
更新:每个工作线程都可以用于读取和写入。如果缺少缓存,则从数据库缓存信息。
问题陈述:我们需要实现缓存来增强性能。 为此,缓存读取更频繁,对缓存的写入操作要少得多。
我认为我们可以使用boost::shared_mutex boost::shared_lock
、boost::upgrade_lock
、boost::upgrade_to_unique_lock implementation
但我们了解到boost::shared_mutex
存在性能问题:
- 读取器写入器锁的性能比较
- Lib boost devel
问题
boost::shared_mutex
是否会影响万一读取频繁时的性能?- 在考虑编译器版本
g++4.4
时,我们可以采取哪些其他构造和设计方法? - 有没有办法绕过如何设计它,这样
reads are lock free
?
此外,我们打算使用Map
来保存缓存信息。
如果写入不存在,一种可能性可以2-level cache
,首先有一个thread-local cache
,然后是normal cache with mutex or reader/writer lock
。
如果写入极为罕见,您也可以这样做。但是有一些无锁的方式来使线程本地缓存失效,例如每次写入都会更新原子 int,并在这些情况下清除线程本地缓存。
你需要分析它。
如果你因为没有一个可以实际测试东西的"足够相似"的环境而陷入困境,你可能会使用 pthreads 编写一个简单的包装器:pthread_rwlock_t
- pthread_rwlock_rdlock
- pthread_rwlock_wrlock
- pthread_rwlock_unlock
当然,您可以将东西设计为无锁。最明显的解决方案是不共享状态。(如果您确实共享状态,则必须检查目标平台是否支持原子指令)。但是,在对您的应用程序域一无所知的情况下,我觉得非常安全,建议您不要无锁。例如,参见无锁算法真的比完全锁定算法的性能更好吗?
这完全取决于更新的频率、缓存的大小以及更新中的更改量。
-
假设您有一个相当大的缓存,每次更新都会进行大量更改。然后我会使用无锁的读取-复制-更新模式。
-
如果您的缓存数据非常小并且一次性读取(例如单个整数),RCU 也是一个不错的选择。
具有 小更新的大缓存或具有 RCU 频繁更新的大缓存读写锁是一个不错的选择。
除了建议你分析它的其他答案外,如果你能以某种方式构建或预测请求的类型、顺序和大小,就会有很大的好处。
-
如果在典型周期中请求特定类型的数据,则最好按数据类型拆分缓存。您将增加缓存命中/未命中比率,并且每个缓存的大小可以适应类型。您还将减少可能的争用。
-
同样,在选择更新方法时,请求的大小也很重要。较小的数据片段可以存储更长时间,甚至可以汇集在一起,而较大的数据片段的请求频率可能较低。
-
即使制定了仅涵盖最常见抓取模式的基本预测方案,您也可能已经大大提高了性能。尝试和训练例如 NN(神经网络)来提前猜测下一个请求绝对是值得的。
- 为什么读取函数在 sha1 c++ 实现中不起作用?
- C++如何正确实现并行IF流读取
- 为 Sql 服务器实现 odbc 包装器.将数据库数据读取为字符或要求驱动程序将数据转换为 C 类型
- Reader类实现中的文件读取错误
- 如何在结构中实现文件读取和创建
- g++-4.4(不在 C++11/14 中)通过 boost::shared_mutex 实现多读取器单编写器是否会影响
- 如何使用单个解锁方法(可称为读取器或写入器)实现C++读写器锁?
- 如何实现将用户输入读取到提供的所有变量中的可变参数模板
- 如何从uint8_t的缓冲区读取带符号整数,而不调用未定义或实现定义的行为
- C SSCANF实现问题(从文件中读取)
- 您将如何在 C++11 中实现自己的读取器/写入器锁
- 关于文件读取器工具实现的建议
- C++ 模板复杂图像读取类执行时间慢,声明和实现分离
- C++中读取写锁定实现
- 实现QProcess的最佳方法是什么,在"real time"中读取stdout和stderr?
- 运算符重载实现:0xC0000005:读取位置存在访问冲突
- 实现一个从输入流中读取一系列值作为参数的函数
- 实现定义的行为和将unicode读取到缓冲区
- 实现有界缓冲区(读取器和写入器之间无块,读取器之间有块,写入器之间有块)
- 当我实现 DBMS 的磁盘管理组件时,是否可以在 C++ 中使用 fstream 来读取或写入文件