Berkeley DB的lock

      上星期想把Berkeley DB封装成一个持久化map——主要目的是降低参数个数和使用难度。没有人想调用map的get或者set函数时要4个参数,每个参数都要去查看Berkeley DB的reference吧?(ps:berkeley db 的文档在开源软件中还算是比较好的……不过关于lock和txn部分我觉得不够清晰,把我折腾得快挂了)
      单进程不使用环境的版本很容易就实现了。(多线程完全可以用进程内同步机制,所以也是没啥问题)
      多进程时必须使用环境,把环境封装好之后,我测试两个进程并发写——够狠,db文件直接就corrupted。那就加lock吧,反正berkeley db有lock子系统,而且看起来不难用……用完之后发现其实还是很难用的,明白的觉得很容易,不明白的遇到一堆陷阱。先后遇到的问题有:
      a) DbEnv::lock_get函数的参数都是啥意思啊
      b) 程序非法退出,没办法释放该程序已经获得的锁(除了使用外部程序db_recovery或者直接删除掉环境文件)
      c) 锁超时的含义和用法不明
答案分别是:
      a) 比较难理解的两个参数是:u_int32_t locker 和 const Dbt *object。locker代表请求锁的对象,可以用lock_id方法获得,同一个locker可以多次获得一个对象的写锁。object就是这个锁的标志了,我觉得用const char*来标记一个锁可能比较容易理解,不过两者没有很大差别就是了,很容易把一个const char* 封装成一个Dbt。
      b) 关键是open环境的时候使用 DB_REGISTER | DB_RECOVER, 可以干掉已故进程获得的锁。(google半天都没找到答案,哎)
      c) 在获得锁之前set_timeout,一样可能无法返回。哈哈。解决方法set_timeout后新建一个线程,周期性地lock_detect。这样如果没有在规定时限内获得锁,就会扔异常而不会不返回了。set_timeout针对的是所有的锁,如果想要针对一个锁指定timeout,就要使用DB_LOCK_NOWAIT 标记了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值