`
mmdev
  • 浏览: 12938041 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

多线程中递归锁的实现

 
阅读更多

本文转载自:http://blog.csdn.net/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熟悉的话,这个递归锁结构应该是比较简单的,就是一个的计数器而已。有了这个递归锁就不用愁在链表插入的时候,在进行查询操作锁会出现问题。


分享到:
评论

相关推荐

    Python之进程+线程+协程(并发与并行、GIL锁、同步锁、死锁、递归锁)

    在Python中GIL解释器锁、同步锁、死锁、递归锁都是什么?怎么这么多锁,它们都是用来控制进程、线程的吗?作为一个程序猿,你真的理解并行与并发,同步与异步了么? 希望本篇文章能给你想要的答案… 一、并发与并行 ...

    Linux多线程服务端编程:使用muduo C++网络库

    《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...

    西电计算机操作系统课程设计pintos-pro3.doc

    1、一个线程获得锁,假设获得这个锁的线程比自己低就进步它的优先级,假设这个锁也 是被锁着,那就递归捐赠优先级,在线程释放掉锁之后,恢复未捐赠的优先级。 2、在释放掉锁的时候,假设优先级改变可以发生抢占。 ...

    java数据分析源码-javaModel:java高级基础知识总结,算法,数据结构,多线程,jvm优化,spring源码分析,java新特性等

    一、多线程高并发(concurrent、jvm包) 1.JUC多线程及高并发 1.1 多线程集合 1.2 cas 1.3 锁 1.4 队列 1.5 线程池 2.JVM+GC解析 demo 二、JDK8新特性(lamp包) 1.四大函数式接口 2.方法引用 3.构造器引用 4.数组...

    DeadLock_Check:死锁检测工具。将别人优秀的GO语言开源项目,用JAVA实现一次

    介绍之前看到的别人用GO语言写了一个死锁检测工具,大概看...看了一下原作者的实现,好像并不是用递归,等考完试有空再看看原作者是怎么实现检测多个线程之间的锁。用法例如,用ReentrantLock,正常开发的时候,我们可

    Java并发编程(学习笔记).xmind

    (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 (2)建模简单:通过使用线程可以讲复杂并且异步的工作流进一步分解成一组简单并且同步的工作流,每个工作流在一个单独的线程...

    TrReadWriteLock:使用互斥量和信号量编写的简单Objective-C读写锁库

    读者-作家锁定用于多线程环境,并允许多个线程同时读取一块共享内存,但一次只能写入一个线程。 该库已创建,可以在使用代码中使用。 尽管这不是必需的。 如何安装? 只需将这四个文件包含到您的iOS或Mac项目中:...

    leetcode伪代码-my-demo:我的演示

    多线程 Concurrent 自旋锁 SpinLock 任务调度器 CommonTaskSchedule 线程池 CommonThreadPool 算法题 LeetCode 链表 LinkedList 栈、队列、堆 Stack,Queue,Dump 贪心算法 GreedyAlgorithm 递归、回溯、分治 ...

    Java并发编程实战

    书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高...

    UNIX 高级教程系统技术内幕

    7.10.2 递归锁 7.10.3 阻塞还是自旋 7.10.4 锁什么 7.10.5 粒度和持续时间 7.11 例子分析 7.11.1 SVR 4.2/MP 7.11.2 Digital UNIX 7.11.3 其他实现 7.12 小结 7.13 练习 7.14 参考文献 第8 章 文件系统接口和框架...

    python入门到高级全栈工程师培训 第3期 附课件代码

    05 递归锁 06 同步对象event 07 信号量 08 线程队列 09 生产者消费者模型 10 多进程的调用 第35章 01 进程通信 02 进程池 03 协程 04 事件驱动模型 05 IO模型前戏 06 阻塞IO与非阻塞IO 07 select及触发方式 08 ...

    数据结构算法

    Parallel的使用 多线程系列(5)5天不再惧怕多线程——第五天 线程池 5天不再惧怕多线程——第四天 信号量 5天不再惧怕多线程——第三天 互斥体 5天不再惧怕多线程——第二天 锁机制 5天不再惧怕多线程——第一天 尝试...

    Java服务器端开发面试.doc

    NIO(通道,缓冲区,选择器) Java服务器端开发面试题篇2 thread, start(), run() 多线程里面的关键字,wait, notfiy, 锁(synchronized), lock接口 线程状态,上下文切换,守护线程 消费者和生产者的几种实现方式,...

    python cookbook(第3版)

    1.6 字典中的键映射多个值 1.7 字典排序 1.8 字典的运算 1.9 查找两字典的相同点 1.10 删除序列相同元素并保持顺序 1.11 命名切片 1.12 序列中出现次数最多的元素 1.13 通过某个关键字排序一个字典列表 ...

    Java学习题答案

    连最基本的资源释放都做不好,还谈什么多线程编程. 6.EJB规范规定EJB中禁止的操作有哪些?(15分) 共有8点,答出下列3-4点得满分. 1.不能操作线程和线程API(线程API指非线程对象的方法如notify,wait等) 2....

    java基础案例与开发详解案例源码全

    12.1.5 为什么需要多线程309 12.1.6 线程分类309 12.2 线程的生命周期309 12.2.1 线程的状态及转换310 12.2.2 线程睡眠311 12.2.3 线程让步313 12.2.4 线程的加入313 12.3 线程的调度和优先级314 12.4 线程的同步315...

    CLR.via.C#.(中文第3版)(自制详细书签)

    13.8 实现多个具有相同方法名和签名的接口 13.9 用显式接口方法实现来增强编译时类型安全性 13.10 谨慎使用显式接口方法实现 13.11 设计:基类还是接口? 第14章 字符、字符串和文本处理 14.1 字符 14.2 ...

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    13.8 实现多个具有相同方法名和签名的接口 13.9 用显式接口方法实现来增强编译时类型安全性 13.10 谨慎使用显式接口方法实现 13.11 设计:基类还是接口? 第14章 字符、字符串和文本处理 14.1 字符 14.2 ...

    CLR.via.C#.(中文第3版)(自制详细书签)Part3

    13.8 实现多个具有相同方法名和签名的接口 13.9 用显式接口方法实现来增强编译时类型安全性 13.10 谨慎使用显式接口方法实现 13.11 设计:基类还是接口? 第14章 字符、字符串和文本处理 14.1 字符 14.2 ...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    13.8 实现多个具有相同方法名和签名的接口 13.9 用显式接口方法实现来增强编译时类型安全性 13.10 谨慎使用显式接口方法实现 13.11 设计:基类还是接口? 第14章 字符、字符串和文本处理 14.1 字符 14.2 ...

Global site tag (gtag.js) - Google Analytics