`
jinghuainfo
  • 浏览: 1526049 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

系统程序员成长计划-并发(三)(上)

 
阅读更多

转载时请注明出处和作者联系方式
文章出处: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 嵌套锁的实现不依赖于特定平台。


欢迎到Linux mobile development上交流
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics