转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog 作者联系方式:李先静 <xianjimli at hotmail dot com>
嵌套锁与装饰模式
在生产者-消费者的练习中,当由双向链表的实现者负责加锁时,一般都会遇到莫名其妙的死锁问题。有的读者可能已经查出来了原因是嵌套的加锁。比如在 dlist_insert中调用了dlist_length,进入dlist_insert时已经加了一次锁,再调用dlist_length时又加了一 次锁,这时就出现了死锁问题。
初学者遇到这个问题的时候,通常的做法是在调用dlist_length之前先解锁,调用完dlist_length后再重新加锁。这样是存在问题的:一个原子操作变成了几个原子操作,数据完整性得不到保证,在你重新加锁之前,其它线程可能利用这个空隙做了些别的事情。
有效解决这个问题的办法有两个,其一是实现一个内部版本的dlist_length,它在里面不加锁。其二是使用嵌套锁,允许同一个线程多次加锁。 pthread有嵌套锁的实现,不过我们在这里不用它,原因是我们要提供一个更通用的解决方案。现在我们不再满足于实现一个双向链表,而是要实现一个跨平 台的基础函数库。
在这里我们请读者实现一个嵌套锁,要求如下:
o 嵌套锁仍然兼容Locker接口。 o 嵌套锁的实现不依赖于特定平台。
posted on 2009-11-17 08:48 张云临 阅读(92) 评论(0) 编辑 收藏 举报