多线程的那点儿事(之嵌套锁)
嵌套锁这个概念,主要是为了根据编程中的一种情形引申出来的。什么情况呢,我们可以具体说明一下。假设你在处理一个公共函数的时候,因为中间涉及公共数据,所以你加了一个锁。但是,有一点比较悲哀。这个公共函数自身也加了一个锁,而且和你加的锁是一样的。所以,除非你的使用的是信号量,要不然你的程序一辈子也获取不了这个锁。
[cpp] view plaincopy
1 HANDLE hLock; 
2  
3 void sub_func() 
4
5     /*...*/ 
6     WaitForSingleObject(hLock, INFINITE); 
7     do_something(); 
8     ReleaseMutex(hLock); 
9     /*...*/ 
10
11  
12 void data_process() 
13
14     /*...*/     
15     WaitForSingleObject(hLock, INFINITE); 
16     sub_func(); 
17     ReleaseMutex(hLock); 
18     /*...*/ 
19
    出现这种情况的原因很多。很重要的一个方面是因为软件的各个模块是不同的人负责的。所以本质上说,我们根本无法确定别人使用了什么样的锁。你也无权不让别人使用某个锁。所以,遇到这种情况,只好靠你自己了。嵌套锁就是不错的一个解决办法。
    1)嵌套锁的数据结构
[cpp] view plaincopy
20 typedef struct _NestLock 
21
22     int threadId; 
23     int count; 
24     HANDLE hLock; 
25 }NestLock; 
26  
27 NestLock* create_nest_lock(HANLDE hLock) 
28
29     NestLock* hNestLock = (NestLock*)malloc(sizeof(NestLock)); 
30     assert(NULL != hNestLock); 
31  
32     hNestLock->threadId = hNestLock->count = 0; 
33     hNestLock->hLock = hLock; 
34     return hNestLock; 
35

    2)申请嵌套锁
[cpp] view plaincopy
36 void get_nest_lock(NestLock* hNestLock) 
37
38     assert(NULL != hNestLock); 
39  
40     if(hNestLock->threadId == GetThreadId()) 
41     { 
42         hNestLock->count ++; 
43     }else
44         WaitForSingleObject(hNestLock->hLock); 
45         hNestLock->count = 1; 
46         hNestLock->threadId = GetThreadId(); 
47     } 
48

    3)释放锁
[cpp] view plaincopy
49 void release_nest_lock(NestLock* hNestLock) 
50
51     assert(NULL != hNestLock); 
52     assert(GetThreadId() == hNestLock->threadId); 
53  
54     hNestLock->count --; 
55 waitforsingleobject函数    if(0 == hNestLock->count){ 
56         hNestLock->threadId = 0; 
57         ReleaseMutex(hNestLock->hLock); 
58     } 
59

文章总结:
    1)嵌套锁与其说是新的锁类型,不如说是统计锁而已
    2)嵌套锁和普通的锁一样,使用十分方便
    3)嵌套锁也有缺点,它给我们的锁检测带来了麻烦


版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。