多线程中递归锁的实现

本文转载自:http://blog.youkuaiyun.com/wtz1985/article/details/301637

在上一篇文章中,我已经阐述了多线程中简单锁的实现,可在结束的时候,我就提了那么一个问题,那就是如果在一个链表中进行插入时,要进行查询的操作,如果只是简单的锁,是没法实现的。所以“递归锁”就浮现于世了。

可能有些人看到递归这两个字,有点傻了眼,其实也没什么的,简单的介绍,就是进行简单的计数而已。刚开始引用锁的时候,就产生它,当在锁没有解开的时候,还要继续用锁,就简单的加一,解开一把就减一,当计数为零时,就把锁销毁掉。下面用程序来简单的阐述一下,递归锁是怎么实现的:

1、递归锁接口的定义。(锁的接口的定义已经在上一篇定义过了,这里不再重复)

  1. /*------recursive_locker.h-------*/
  2. #ifndef_RECURSIVE_H
  3. #define_RECURSIVE_H
  4. #include"locker.h"
  5. Locker*recursive_locker_create(Locker* real_locker);
  6. #endif/*_RECURSIVE_H*/

2、递归锁的实现。

  1. /*------recursive_locker.c------*/
  2. #include"recursive_locker.h"
  3. #include<stdlib.h>
  4. #include<stdio.h>
  5. #include<assert.h>
  6. #include<string.h>
  7. typedefstruct_PrivInfo
  8. {
  9. Locker*real_locker;
  10. pthread_tcurrent_pthread_locker;
  11. intlocker_count;
  12. }PrivInfo;
  13. staticintrecursive_locker_lock(Locker*thiz)
  14. {
  15. assert(thiz!=NULL);
  16. PrivInfo*priv=thiz->priv;
  17. if(priv->current_pthread_locker==pthread_self())
  18. {
  19. priv->locker_count++;
  20. }
  21. else
  22. {
  23. locker_lock(priv->real_locker);
  24. priv->lcoker_count=1;
  25. priv->current_pthread_locker=pthread_self();
  26. }
  27. return0;
  28. }
  29. staticintrecursive_locker_unlock(Locker*thiz)
  30. {
  31. assert(thiz!=NULL);
  32. PrivInfo*priv=thiz->priv;
  33. if(priv->current_>pthread_locker==pthread_self())
  34. {
  35. if(priv->locker_count==1)
  36. {
  37. priv->locker_count=0;
  38. priv->current_pthread_locker=0;
  39. locker_unlock(priv->real_locker);
  40. }
  41. else
  42. {
  43. priv->locker_count--;
  44. }
  45. }
  46. else
  47. {
  48. assert(!"error");
  49. }
  50. return0;
  51. }
  52. staticvoidrecursive_locker_destroy(Locker*thiz)
  53. {
  54. assert(thiz!=NULL);
  55. PrivInfo*priv=thiz->priv;
  56. locker_destroy(priv->real_locker);
  57. free(thiz);
  58. return;
  59. }
  60. Locker*recursive_locker_create(Locker*real_locker)
  61. {
  62. Locker*thiz=(Locker*)malloc(sizeof(Locker)+sizeof(PrivInfo));
  63. PrivInfo*priv=thiz->priv;
  64. priv->real_locker=real_locker;
  65. priv->current_pthread_locker=0;
  66. priv->locker_count=0;
  67. thiz->lock=recursive_locker_lock;
  68. thiz->unlock=recursive_locker_unlock;
  69. thiz->locker_destroy=recursive_locker_destroy;
  70. returnthiz;
  71. }

上面就是递归锁的实现。如果对COM熟悉的话,这个递归锁结构应该是比较简单的,就是一个的计数器而已。有了这个递归锁就不用愁在链表插入的时候,在进行查询操作锁会出现问题。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值