博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程编程之嵌套锁
阅读量:6907 次
发布时间:2019-06-27

本文共 1601 字,大约阅读时间需要 5 分钟。

  嵌套锁只是针对一种特殊情况而引申出来的锁应用形式而已。

  参考下面这种应用场合:

HANDLE hLock;void sub_func(){    WaitForSingleObject(hLock, INFINITE);    do_something();    ReleaseMutex(hLock);}void data_process(){    WaitForSingleObject(hLock, INFINITE);    sub_func();    ReleaseMutex(hLock);}

   可以发现,sub_func()和data_process()都使用了相同的一把锁hLock。很明显,如果hLock不是信号量,那么sub_func()被data_process()调用之后将永远无法获取这把锁。怎么办呢?这个时候应该设计一种针对这种情况的特殊锁,也就是本文要说的嵌套锁

  嵌套锁的设计形式为:

typedef struct _NestLock{    int threadId;    /*记录线程ID*/    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;}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();    }}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);    }}void destroy_nest_lock(NestLock** phNestLock){    assert(NULL != phNestLock);    assert(NULL != *phNestLock)    free(*phNestLock);    *phNestLock = NULL;}

 

小结:

  1. 嵌套锁不是一种新型锁,准确来说应该叫统计锁,只是针对特殊场合的一种应用形式而已;
  2. 嵌套锁的缺陷是监测起来比较麻烦一点。

转载于:https://www.cnblogs.com/kuliuheng/p/4070528.html

你可能感兴趣的文章
添加占位图片
查看>>
正则表达式
查看>>
Lepus(天兔)监控MySQL部署
查看>>
Selenium应用代码(登录)
查看>>
Node.js权威指南 (4) - 模块与npm包管理工具
查看>>
CLR Via CSharp读书笔记(18):定制Attributes
查看>>
Java_捕获到异常之后_抛出运行时异常_的好处
查看>>
JavaScript表格、表单
查看>>
中文词频统计
查看>>
时代亿信 终端安全登录产品
查看>>
如何用命令将本地项目上传到git
查看>>
Visual Studio 2017
查看>>
2733. [HNOI2012]永无乡【平衡树-splay】
查看>>
Qt5 QTableWidget设置列表自动适应列宽
查看>>
sql server 存储过程
查看>>
Sqlite Client for Windows Phone
查看>>
linux和windows的区别
查看>>
spark机器学习之KMeans算法实现
查看>>
华为敏捷/DevOps实践:产品经理如何开好迭代计划会议
查看>>
随记之oracle查询某字段某几位的条件 substr
查看>>