免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: converse
打印 上一主题 下一主题

[算法] 发布我的开源cache库ccache [复制链接]

论坛徽章:
1
天蝎座
日期:2013-08-25 10:27:22
31 [报告]
发表于 2008-04-04 13:10 |只看该作者
原帖由 yangsf5 于 2008-4-3 11:16 发表
还没明白的地方:
这个cache里,可以有多张哈希表。。
建多张表的用意是:可以多张表并行的处理同时要求处理的太多的结点吗?

如果是这样,那个算法是否处理了同个结点的位置唯一性?



都那么强,就没人回答我的问题吗?

论坛徽章:
0
32 [报告]
发表于 2008-04-04 16:37 |只看该作者
插入节点的时候,首先会在所在HASH表中查找节点是否已经存在,如果存在报错退出,否则进行插入操作,在函数insert_data中.

有问题,Read The Fu**ing Source, pls.

论坛徽章:
0
33 [报告]
发表于 2008-04-04 16:58 |只看该作者
给楼主提几个建议:
1、建议所有文件都用LF结尾
2、建议所有文件都用统一的编码:UTF-8
3、建议建一个doc文件夹内放Doxygen生成的文档

以下就是楼主没有这样做后,我自己用doxygen生成的文档图(编码实在头疼哪!):

a1.png (105.48 KB, 下载次数: 73)

a1.png

a2.png (101.87 KB, 下载次数: 62)

a2.png

论坛徽章:
0
34 [报告]
发表于 2008-04-05 00:46 |只看该作者

回复 #33 jamesr 的帖子

关于这个问题,我决定以后的版本注释一律采用英文注释.

论坛徽章:
0
35 [报告]
发表于 2008-04-05 12:33 |只看该作者
楼主用mmap文件存储数据,应该用的是文件锁吧。文件锁支持按偏移和大小加锁的,不用每次锁住全部。

论坛徽章:
0
36 [报告]
发表于 2008-04-05 16:39 |只看该作者
之所以要采用全局锁,是因为一直没有解决这样的问题:

进程A要对hash表a进行插入操作,此时锁住hash表a,但是发现当前已经没有空闲节点,要采用淘汰算法进行淘汰,假设需要淘汰hash表b上的一个节点,此时hash表b已经被另一个进程B锁住,而进程B要进行淘汰的节点又在hash表a上,如此情况,造成死锁.

因此,现在的折中策略是对全局进行加锁,减少锁粒度属于今后的优化,暂缓.

论坛徽章:
0
37 [报告]
发表于 2008-04-05 20:20 |只看该作者
原帖由 converse 于 2008-4-2 11:51 发表
同时还有unlock_cache api,因为某些使用C++的用户如果使用了C++的异常处理,在调用ccache中的API时抛出异常将导致ccache没有解锁
, 以后就不能再使用了, 提供这个API是为了在抛出异常的时候用户自己释放锁


对于这个问题,在 c++ 中倒是可以通过 RAII 来处理。
RAII英文意思:Resource acquisition is initialization,资源获取即初始化。该原则或技术用于对资源的管理。其核心思想,就是在对象的生命周期中,资源总是有效。而对象结束时,资源会自动释放。

典型的实现

  1. class MutexGuard {
  2. public:
  3.     MutexGuard( Lock_t * lock ) {
  4.         mLock = lock;
  5.         lock->lock();
  6.     }

  7.     ~MutexGuard() {
  8.         mLock->unlock();
  9.     }

  10. private:
  11.     Lock_t * mLock;
  12. };

  13. void Cache :: put( ... )
  14. {
  15.     MutexGuard guard( mLock );

  16.     ..........
  17. }
复制代码

[ 本帖最后由 iunknown 于 2008-4-5 20:23 编辑 ]

论坛徽章:
0
38 [报告]
发表于 2008-04-07 13:43 |只看该作者
支持,有时间学学...

论坛徽章:
1
天蝎座
日期:2013-08-25 10:27:22
39 [报告]
发表于 2008-04-11 21:51 |只看该作者

  1. int find_data(const void* key, void* data, ccache_t* cache, cmpfun cmp)
  2. {
  3.     int hashindex = hash(key, cache), ret;
  4.     void *nodedata;
  5.     node_t *node;

  6.     if (0 > lock(&(cache->mutex)))
  7.     {
  8.         return -1;
  9.     }

  10.     ret = FIND_NODE(hashindex, key, cache, cmp);

  11.     if (0 <= ret)
  12.     {
  13.         if (NULL != data)
  14.         {
  15.             node = NODE(cache, ret);
  16.             nodedata = NODE_DATA(node);
  17.             memcpy(data, nodedata, node->datasize);
  18.         }
  19.         linktolrulisthead(ret, cache);
  20.     }

  21.     if (0 > unlock(&(cache->mutex)) || 0 > ret)
  22.     {
  23.         return -1;
  24.     }
  25.     return ret;
  26. }
复制代码

搂住这个函数有问题。。。
在调用这个函数时,对返回值进行判断。
>=0...说明节点存在。。
但是对于-1,就不能确定了:
可以是还没判断就因为锁出错返回-1;也可以是没有这个节点返回-1(因为链表里的最后一个节点的next是-1)。
(算了,不愿回答就算了。。。)

  1. int list_findnode(int hashindex, const void* key, ccache_t* cache, cmpfun cmp)
  2. {
  3.     hashitem_t *hashitem = HASH_ITEM(cache, hashindex);
  4.     int index = hashitem->first;
  5.     node_t *node;
  6.     void* nodekey;

  7.     while (0 <= index)
  8.     {
  9.         node = NODE(cache, index);
  10.         nodekey = NODE_KEY(node);
  11.         if (!cmp(key, nodekey))
  12.         {
  13.             break;
  14.         }

  15.         index = node->next;
  16.     }

  17.     return index;
  18. }
复制代码

[ 本帖最后由 yangsf5 于 2009-1-5 13:06 编辑 ]

论坛徽章:
0
40 [报告]
发表于 2008-08-07 17:29 |只看该作者
新版本发布,这次最大的feature就是支持可变长key/value了,请见首页更新说明.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP