【发布时间】:2011-11-11 17:06:20
【问题描述】:
这就是我所拥有的:
- Windows 服务
- C#
- 多线程
- 服务使用读写锁(一次多次读取,写入阻塞其他读/写线程)
- 一个简单的自写数据库
- C++
- 小到可以放入内存
- 足够大,不想在启动时加载它(例如 10GB)
- 读取性能非常重要
- 写作没那么重要
- 树形结构
- 保存在树节点中的信息存储在文件中
- 为提高性能,文件仅在首次使用和缓存时加载
- 延迟初始化以加快数据库启动
由于数据库会非常频繁地访问这些节点信息(每秒数千次),而且我不经常写,我想使用某种双重检查锁定模式。
我知道这里有很多关于双重检查锁定模式的问题,但似乎有很多不同的意见,所以我不知道什么是最适合我的情况。你会如何处理我的设置?
这是一个例子:
- 一棵有 100 万个节点的树
- 每个节点存储一个键值对列表(存储在一个文件中用于持久化,文件大小大小:10kB)
- 第一次访问节点时,列表被加载并存储在一个映射中(sth. like std::map)
- 下次访问这个节点的时候就不用再加载文件了,直接从map中获取就行了。
- 唯一的问题:两个线程第一次同时访问节点,想要 写入缓存映射。这不太可能发生,但也不是不可能。这就是我需要线程安全的地方,这不应该花费太多时间,因为我通常不需要它(尤其是当整个数据库都在内存中时)。
【问题讨论】:
-
你已经拥有这一切了吗?然后我就坐下来,运送它并享受意外之财。
-
你能比“几个 GB”更精确地估计大小吗?我认为非常很难将整个数据库放入内存中。例如,您可能会考虑存储压缩的数据(例如,一些基于 LZ 的压缩)以提供帮助。即使保存 几个 磁盘访问也可以涵盖相当多的解压缩时间。
-
@Kerrek:我想坐下来享受一下,但现在我不能以多线程方式使用数据库,因为它还不是完全线程安全的。因此这个线程;)
-
@Jerry Coffin:目的是将整个数据库保存在内存中。目前,数据库足够小,可以放入一台计算机的 RAM。 DB变大需要的时间,我们希望有一个分布式的解决方案。数据库信息仅出于持久性原因保存在文件中。我只是不想在将所有内容加载到内存时等待数据库启动,所以我使用的是惰性缓存,这使得多线程很难使用它。
标签: c++ windows multithreading caching double-checked-locking