分享

zookeeper c++客户端 锁zoolock失效

wenmang168 发表于 2013-10-16 13:41:05 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 4 12134
最近在用zoolock 实现分布式锁,在多线程模式下,锁释放后,有的时候会出现其他线程获取不到锁
我的代码大概实现是,
线程中的逻辑:
用zkr_lock_lock锁,然后用zkr_lock_isowner判断释放锁成功
锁成功后,再释放锁zkr_lock_unlock
但是我在3个线程的情况下,经常会出现,线程A锁成功,线程B,C都在等锁,但是在线程A释放锁后,会出现线程B,线程C都获取不到锁。
请高手指教。
              
               
               

已有(4)人评论

跳转到指定楼层
wenmang168 发表于 2013-10-16 13:42:04

            请各位大侠指教
        
回复

使用道具 举报

benhu218 发表于 2013-10-16 13:43:04

            用的是zookeeper源码中的zookeeper/src/recipes/lock吗?
应该没问题啊
        
回复

使用道具 举报

zhang691753540 发表于 2013-10-16 13:43:59

            我也遇到过这样的情况,查看它的源码,它注册的回调也是zkr_lock这个函数,可以尝试在多次获取不到锁的时候再次进行加锁调用(毕竟zookeeper自己注册的回调也是再次加锁操作)
        
回复

使用道具 举报

zhang691753540 发表于 2013-10-16 13:44:30

            引用 3 楼 zhang691753540 的回复:我也遇到过这样的情况,查看它的源码,它注册的回调也是zkr_lock这个函数,可以尝试在多次获取不到锁的时候再次进行加锁调用(毕竟zookeeper自己注册的回调也是再次加锁操作)
当时遇到这个问题,就用上述方法搞定了。后来看了一下它的实现,由于实现中是首先创建一个临时节点然后再去注册上个节点的回调,我猜测这中间的时序问题,即节点建立与节点回调注册的不确定性,当然上述死锁比较难以重现,所以只是猜测,没有什么根据
第二种的可能就是注册上个节点的退出观察失败,然后本线程中存在了死锁导致整个分布式锁死锁现象,这种可以在代码中验证并且是zookeeper给出锁的例子的bug吧。zookeeper使用版本为3.4.3
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条