免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1552 | 回复: 5

pppk之Recipe5.3(2) [复制链接]

论坛徽章:
0
发表于 2012-08-22 21:05 |显示全部楼层
这几天做项目有些赶。项目里原先做开发的人因为受不了太辛苦,又转去做support了,现在开发就我和另一个负责人了。而负责人的任务主要就是把活压给我。我本来是负责2个项目的platform代码和其中一个项目的实现的。现在虽然platform和自己的项目都完成了,另一个项目又到我手里了。唉,项目高层的负责人倒是轻松,说句你负责就行了。难道就不怕我走人了后,2个项目没人能接手吗?催吧。继续催。我尽力而为,无欲则刚就好了。

我们下面接着写昨天的Hash锁。

论坛徽章:
0
发表于 2012-08-22 21:18 |显示全部楼层
今天要讲得是lock_value这个函数。它的功能是能锁住某个Key对应的值。但是其实Perl会告诉你这个锁不安全。

lock_value的用法是lock_value( %has, key );
  1. lock_value( %hTestHash, "FOUR" );
  2. eval{# We can modify the value here
  3.         $hTestHash{ FOUR } = 5;
  4. };
  5. print "We can't modify the value of key 'FOUR', when it is locked:[$@]" if $@;
  6. printHash(  \%hTestHash );
复制代码
这里我们试图把在昨天已经加入的"FOUR" => 4 , 修改其值为5。但由于我们刚刚已经讲"FOUR"对应的值锁住了,所以这里修改值的操作失败了。看来锁管用。但这时候,Perl发出了个warning:
  1. Cannot usefully lock values in an unlocked hash at /develop/Project/Perl/pppk/Hashes/Recipe5.3/perl.pl line 95
复制代码
怎么?还不能有效锁住value吗?的确。我们接下来的操作会让显示这句话的一些意思。

既然锁住的是key对应的value,那我们把这个key删掉会如何呢?锁会阻止我删除吗?带着这样的疑问,我尝试了下。
  1. eval{# the lock on "FOUR" is expired.
  2.         delete $hTestHash{ FOUR };
  3. };
  4. print "We can delete key 'FOUR' when it is locked." if not $@;
  5. printHash(  \%hTestHash );
复制代码
从异常和输出来看,即使value被锁住,但是居然是可以删除key的。而且这里我提前注释了下,已有的锁过期了,失效了。

论坛徽章:
0
发表于 2012-08-22 21:31 |显示全部楼层
在删除了锁住的key/value后,我们重新加入刚刚的key,只是这里把值换成了5。我们想看看会发生什么样的异常。但是居然一切平安无事!也就是说,这里的value锁不起作用了。这印证了Perl的警告
  1. print "Lock expired!\n";
  2. eval{# Add 'FOUR' again
  3.         $hTestHash{ FOUR } = 5;
  4. };
  5. print "We can modify the value of key 'FOUR', when the lock is expired!" if not $@;
  6. printHash(  \%hTestHash );

  7. print "=====\n";
  8. eval{
  9.         $hTestHash{ FOUR } = 6;
  10. };
  11. print "We can modify the value of key 'FOUR' again, when the lock is expired!" if not $@;
  12. printHash(  \%hTestHash );
  13. unlock_value(%hTestHash,"FOUR");
复制代码
这里我们先insert原先key为4的记录并再次更改其值。都没问题。锁已经没有任何作用了。最后我们通过unlock_value来释放value锁,释放的时候必须要指定key的值,不然报错.

论坛徽章:
0
发表于 2012-08-22 21:39 |显示全部楼层
最后还有个小细节。就是我们试图锁住hash里不存在对应key的value,比如这里没有"TEN"。我们就锁住它。
在我们试图锁住这个不存在的key的时候,Perl把这个key加进到了hash里去,其值是undef. 由于value被锁住,在无法删除该key的情况下,你是不能修改它的值的。这里要值得注意.
  1. # Lock the value where the key is not in the hash.
  2. # It inserts the key with a value undef.
  3. lock_value(%hTestHash,"TEN");
  4. print "Lock a non-exixted key\n";
  5. printHash(  \%hTestHash );
  6. eval{
  7.         $hTestHash{ TEN } = "10"
  8. };
  9. print "We can't insert the value of key 'TEN', when it is locked:[$@]" if $@;
  10. unlock_value(%hTestHash,"TEN");
复制代码

论坛徽章:
0
发表于 2012-08-22 21:43 |显示全部楼层
我刚还想到,锁的嵌套问题。比如一种锁加上去后,又加另一种锁。这里就不实践了。我想lock_hash的等级是最高的。

lock_keys和lock_value由于后者在删除key的时候会失效,所以它应该比lock_keys的有效性稍微差些吧。大家有什么经验,欢迎分享!

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
发表于 2012-08-22 22:57 |显示全部楼层
呵呵,坚持每天报道
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP