Chinaunix首页 | 论坛 | 博客
  • 博客访问: 72813
  • 博文数量: 172
  • 博客积分: 2047
  • 博客等级: 大尉
  • 技术积分: 1745
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-19 15:23
文章分类

全部博文(172)

文章存档

2011年(72)

2010年(100)

我的朋友

分类: C/C++

2011-04-08 10:35:44

1、测试两个线程,一个使用lock 一个用于删除。删除在使用之后是没有问题的,测试先删除后使用的情况。
worker2 start 0
worker2 working 0
worker1 start 0
worker2 end working,he want to destroy lock 0
destroy lock 0
worker1 working 0
worker1 end working 22

worker2 先执行。worker1等待。worker2  destroy lock 时,worker1 还没有占有锁。这里的意思是,
它阻塞等待锁,但是并不意味着它一定占有的锁。在worker2,后面添加一个等待时间更明显
res = pthread_mutex_unlock(&lock_);
//usleep(10);
res = pthread_mutex_destroy(&lock_);

worker2 start 0
worker2 working 0
worker1 start 0
worker1 working 0
worker2 end working,he want to destroy lock 0
destroy lock 16
worker1 end working 0


从一个线程解锁,到另外一个线程占有锁这是有一段时间的。这段时间是无锁的。


如果有一个对象设置了删除标志。可是这个对象本身可能已经被删除掉了。那么用它的标志来判断它是否删除。从理论上来说是不安全的。

如果应用标志来判断。
从判断标志到退出这里是有一段时间。如果这里sleep 系统就会先做其他的了。
但是如果这个是一个原子的过程,那么就没有关系了。当然即使不是原子也没有关系。最后unlock 会失败。但是关系不大。这里属于正常。

worker2 start 0
worker2 working 0
worker1 start 0
worker2 end working,he want to destroy lock 0
destroy lock 0
lock is destroyed, can't use
unlock 22


如果删除的操作完全发生在使用之前。
worker2 start 0
worker2 working 0
worker2 end working,he want to destroy lock 0
destroy lock 0
worker1 start 0
lock is destroyed, can't use 22
unlock 22

也可以退出。可以从两个地方来判断。lock 的返回值。这里如果返回失败说明对象已经被清除掉了。就直接返回就可以了。
如果lock返回值是对的。但是删除标志设置的是删除状态。那么说明对象已经清除了。但是还没有删除lock。
如果lock 是对的。删除标志也没有置为删除状态。那么说明还没有开始删除。

两个线程执行可能的情况。


删除错误的情况为何出现。在unlock后又有线程占据了锁。
而在线程没有lock之前又执行了destroy 操作。
这种情况发生极小,危害是没有正确删除lock。可能占据内存。但是对系统数据没有影响。

我们现在考虑的是确定对象是否已经被删除了。这种情况下,我们可以去找服务器重新获取了。
分离的状态。我们使用的对象依赖于目录结构中的对象。可以使用对象复制。这样减少影响范围。
便于集中的管理。
除非是dir 自身的修改。

如果把其中的部分代码子程序化。得分析面临的情况。每个操作,对目录进行什么操作。是读取,还是修改。操作中的公共部分。并不是所有相似的代码都能够提取子程序。这种散列形式有时是必须的。

阅读(726) | 评论(0) | 转发(0) |
0

上一篇:多线程

下一篇:bug1 rename 特殊情况

给主人留下些什么吧!~~