找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3374|回复: 0

多线程的那点儿事(之嵌套锁)

[复制链接]
发表于 2011-12-20 10:08:46 | 显示全部楼层 |阅读模式
【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】


    嵌套锁这个概念,主要是为了根据编程中的一种情形引申出来的。什么情况呢,我们可以具体说明一下。假设你在处理一个公共函数的时候,因为中间涉及公共数据,所以你加了一个锁。但是,有一点比较悲哀。这个公共函数自身也加了一个锁,而且和你加的锁是一样的。所以,除非你的使用的是信号量,要不然你的程序一辈子也获取不了这个锁。
view plain

  • HANDLE hLock;  

  • void sub_func()  
  • {  
  •     /*...*/
  •     WaitForSingleObject(hLock, INFINITE);  
  •     do_something();  
  •     ReleaseMutex(hLock);  
  •     /*...*/
  • }  

  • void data_process()  
  • {  
  •     /*...*/
  •     WaitForSingleObject(hLock, INFINITE);  
  •     sub_func();  
  •     ReleaseMutex(hLock);  
  •     /*...*/
  • }  

    出现这种情况的原因很多。很重要的一个方面是因为软件的各个模块是不同的人负责的。所以本质上说,我们根本无法确定别人使用了什么样的锁。你也无权不让别人使用某个锁。所以,遇到这种情况,只好靠你自己了。嵌套锁就是不错的一个解决办法。


    (1)嵌套锁的数据结构
view plain

  • typedef
    struct _NestLock  
  • {  
  •     int threadId;  
  •     int count;  
  •     HANDLE hLock;  
  • }NestLock;  

  • NestLock* create_nest_lock(HANLDE hLock)  
  • {  
  •     NestLock* hNestLock = (NestLock*)malloc(sizeof(NestLock));  
  •     assert(NULL != hNestLock);  

  •     hNestLock->threadId = hNestLock->count = 0;  
  •     hNestLock->hLock = hLock;  
  •     return hNestLock;  
  • }  


    (2)申请嵌套锁

view plain

  • void get_nest_lock(NestLock* hNestLock)  
  • {  
  •     assert(NULL != hNestLock);  

  •     if(hNestLock->threadId == GetThreadId())  
  •     {  
  •         hNestLock->count ++;  
  •     }else{  
  •         WaitForSingleObject(hNestLock->hLock);  
  •         hNestLock->count = 1;  
  •         hNestLock->threadId = GetThreadId();  
  •     }  
  • }  


    (3)释放锁

view plain

  • void release_nest_lock(NestLock* hNestLock)  
  • {  
  •     assert(NULL != hNestLock);  
  •     assert(GetThreadId() == hNestLock->threadId);  

  •     hNestLock->count --;  
  •     if(0 == hNestLock->count){  
  •         hNestLock->threadId = 0;  
  •         ReleaseMutex(hNestLock->hLock);  
  •     }  
  • }  


文章总结:
    (1)嵌套锁与其说是新的锁类型,不如说是统计锁而已
    (2)嵌套锁和普通的锁一样,使用十分方便
    (3)嵌套锁也有缺点,它给我们的锁检测带来了麻烦
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-22 18:44 , Processed in 0.016530 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表