多线程的map的处理

yangyunzhao 2011-12-09 10:04:08
我开发的时候遇到一个难题。

需求是这样的:

有一个map的数据结构,用于保存某些值。
类似:map<int, Struct*> data;


有N个线程在访问它,读取其中的Struct*指针。
读取大概如:Struct * ptr = data[key];

还有一个线程是会修改它,或者新增值。
新增大概如: Struct * newValue = new Struct(); data[newKey] = newValue;
修改大概如:Struct * value = data[key]; value->val1 = 145; value->val2=232; value->val3=35432;

如果不考虑效率的话,用读写锁是最简单的了。但是问题在于我的读线程可能每秒访问数万次,使用读写锁明显造成性能瓶颈啊。


请问有没有别的什么方案。不限于map。
1、可以高效的通过key查询到value。
2、可以不加锁的插入。
3、可以不加锁的修改(此时读取到脏数据无所谓,只要系统不崩溃即可)。
...全文
134 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangyunzhao 2011-12-09
  • 打赏
  • 举报
回复
楼上两位说的都有道理。

但是我觉得应该可以通过更好的设计解决这个问题。

至少,如果是通过读写锁来解决这个问题,简单是非常简单也肯定可行。但是这个相当于数据库的表级锁,是最不好的设计,最好有类似数据库的行级锁吧?但是完全没有头绪。

而且我的想法也是不采用stl的map,想自己写个数据结构。

还有楼上的朋友,请注意我的前提:N个线程读取,一个线程修改或新增,且修改的时候读取脏数据无所谓。
seucs 2011-12-09
  • 打赏
  • 举报
回复
对于你使用标准库的map,如果不使用锁的话不仅仅是脏数据的问题,还有可能就是造成segment fault。map的实现一般是红黑树数据结构,你想想,要是两个线程都在增加时同时修改树结构,会导致什么问题?
所以个人认为,要想不加锁、又要高效检索,就像鱼和熊掌不能兼得,只能采取折中办法
maoxing63570 2011-12-09
  • 打赏
  • 举报
回复
在正确性与性能之间,我选择正确性

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧