多线程的那点儿事(之嵌套锁)
嵌套锁这个概念,主要是为了根据编程中的一种情形引申出来的。什么情况呢,我们可以具体说明一下。假设你在处理一个公共函数的时候,因为中间涉及公共数据,所以你加了一个锁。但是,有一点比较悲哀。这个公共函数自身也加了一个锁,而且和你加的锁是一样的。所以,除非你的使用的是信号量,要不然你的程序一辈子也获取不了这个锁。
[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)嵌套锁的数据结构
(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)嵌套锁也有缺点,它给我们的锁检测带来了麻烦
(3)嵌套锁也有缺点,它给我们的锁检测带来了麻烦
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论