多线程中递归锁的实现

来源:互联网 发布:linux 清空日志 编辑:程序博客网 时间:2024/04/30 00:09

转自:http://blog.csdn.net/wtz1985/article/details/3016375

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

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

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. typedef struct _PrivInfo
  8. {
  9.   Locker*  real_locker;
  10.   pthread_t current_pthread_locker;
  11.   int locker_count;
  12. }PrivInfo;
  13. static int recursive_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.   return 0;
  28. }
  29. static int recursive_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.   return 0;
  51. }
  52. static void recursive_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.   return thiz;
  71. }

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

原创粉丝点击