技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 算法 --> 关于tokyocabinet的list操作

关于tokyocabinet的list操作

浏览:1550次  出处信息

如果有多个进程同时对一个mdb(其它的没看,不敢随便乱说)执行list操作,结果会怎样; 或许你会显得当然地认为相互没有太大关系,至少我开始时这么认为的,但是在看源码的时候,发现有些不太对劲儿,我们先看一下源码:

tcutil.c

  1. /* Initialize the iterator of an on-memory hash database. */
  2. void tcmdbiterinit(TCMDB *mdb){
  3.   assert(mdb);
  4.   if(pthread_mutex_lock(mdb->imtx) != 0) return
  5.   for(int i = 0; i < TCMDBMNUM; i++){
  6.     tcmapiterinit(mdb->maps[i]);
  7.   }
  8.   mdb->iter = 0;
  9.   pthread_mutex_unlock(mdb->imtx);
  10. }

说明:
   1. 在操作mdb的时候,需要给这个mdb加锁,显然这个mdb是一个全局的对象,而不是当前线程私有的,如果另有一个list请求,显然还是用同一个mdb对象,list时使用到了mdb的iter属性;由此看来,多个list请求应该是相互干扰的。下面做一个测试

1. 初始化一个mdb,不需要太多记录,假设200条记录吧
2. 先启动一个list进程,每取出一条记录sleep 100ms;
3. 1s后启动另一个list进程(前一个进程还没有list完成)
4. 这时,我们会发现进程1又重新获取了已经获取的记录,但不是全部,因为有部分被进程2读取了

下面是第一个进程或取的部分key:value
a4:a
a13:a
a22:a
a31:a

a39:a
a40:a
a48:a
a57:a
a66:a
a75:a
a13:a
a31:a

a40:a
a57:a
a75:a
a93:a
a112:a
a129:a
a138:a
a156:a

我们发现a13读取了两次; 第二次没有读取到a22, 是被第二个进程读取走了,然后就直接读取到了a31

------------------------
还有一个问题,我写入的时候是挨个按照顺序写入的,为什么list的时候有漏洞呢?或许你还发现一点,至少在一段内是从小到大的。

说明:
写入的时候,是按照不同的hash值写入到了8个map中的,而list的时候,是通过for循环8个map来list的,明白了?哦,好吧,that's over。

建议继续学习:

  1. 开源世界中的算法与数据结构 3 -- Linux Kernel List 和GList    (阅读:2958)
  2. cacti 增加 Tokyocabinet 监控    (阅读:2686)
  3. 思考mysql内核之初级系列8---innodb的list算法    (阅读:1909)
  4. 关于tokyocabinet的memory db 的filesize与使用内存的关系    (阅读:1565)
  5. 安装tokyocabinet的问题    (阅读:1387)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1