(第四章 3)锁与嵌套锁的实现

本文介绍了如何在C/C++和Java中实现锁及嵌套锁,以改进单线程双向链表以支持多线程。通过回调函数和接口隔离平台依赖,并提供在运行时切换线程模式的能力。文章讨论了锁的使用场景,避免死锁的方法,以及嵌套锁如何确保线程安全,特别强调了pthread库在锁机制中的应用。
摘要由CSDN通过智能技术生成

一、锁

      在书中,我们实现一个锁的背景是:对已经写好的单线程的双向链表做一个改进,使得它可以支持单线程和多线程两种方式。并且满足以下要求:

      要求1. 对于多线程版本,由实现者(链表)加锁/解锁,以防调用者忘记解锁造成死锁。

      解决思路:这个好办,只要在实现链表的时候在相应的操作函数中加锁即可。

 

      要求2. 区分单线程和多线程版本时,即不需要链接不同的库,也不需要用宏来进行控制,完全可以在运行时切换。

      解决思路:

                       单线程版本调用DList* dlist=dlist_create(NULL, NULL, NULL);

                       多线程版本调用DList* dlist=dlist_create(NULL, NULL, locker_pthread_create());

 

      要求3. 保持双向链表的通用性,不依赖特定的平台。

      解决思路:锁的实现恰恰是依赖平台的(这是“变化的因素”),因此需要“隔离变化”。要隔离变化,自然要用到“回调函数”。这里的回调函数无非加锁/解锁/销毁锁,对于一组相关的回调函数可以把他们整合到一个“接口”中。在下面的代码中我们将看到,C语言的接口中是回调函数(Java的接口中是抽象方法)

 

      综上,思路应该是:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值