一、锁
在书中,我们实现一个锁的背景是:对已经写好的单线程的双向链表做一个改进,使得它可以支持单线程和多线程两种方式。并且满足以下要求:
要求1. 对于多线程版本,由实现者(链表)加锁/解锁,以防调用者忘记解锁造成死锁。
解决思路:这个好办,只要在实现链表的时候在相应的操作函数中加锁即可。
要求2. 区分单线程和多线程版本时,即不需要链接不同的库,也不需要用宏来进行控制,完全可以在运行时切换。
解决思路:
单线程版本调用DList* dlist=dlist_create(NULL, NULL, NULL);
多线程版本调用DList* dlist=dlist_create(NULL, NULL, locker_pthread_create());
要求3. 保持双向链表的通用性,不依赖特定的平台。
解决思路:锁的实现恰恰是依赖平台的(这是“变化的因素”),因此需要“隔离变化”。要隔离变化,自然要用到“回调函数”。这里的回调函数无非加锁/解锁/销毁锁,对于一组相关的回调函数可以把他们整合到一个“接口”中。在下面的代码中我们将看到,C语言的接口中是回调函数(Java的接口中是抽象方法)
综上,思路应该是: