C/C++技巧
+ -

C/C++技巧 自动解锁

2023-06-06 36 0

在线程或进程的同步时,经常需要用到临界体,互斥体等同步对象,在需要同步的片段开始出使用临界体加EnterCriticalSection,同步对象的结束处加LeaveCriticalSection,当然这样写是没有任何问题的,那有没有更加简单的方法来书写呢?
我们可以利用类的构造和析构来进行自动化的加解锁。

如:

class CMylock
{
CRITICAL_SECTION m_cs; 
Public:
    CMyLock(CRITICAL_SECTION &  cs)
    {
         m_cs = cs;
         EnterCriticalSection(&m_cs);
    }
    ~ CMyLock()
    {
         LeaveCriticalSection(&m_cs);
    }
};


Void Fun (CRITICAL_SECTION &  cs)
{
    //在大括号范围内lock有效,退出后自解析,释放锁
    {
         CMylock lock(cs);
        //做一些同步事情
    }

}

可考虑将其写成模板类,针对不同的对象进行特例化

Template<typename LOCKTYPE>
Class CMyLock
{
...
}
eg: CMyLock< CRITICAL_SECTION > lock;

这只是一个例子,对于一些成对出现的一些情况,都是可以这样使用。
其实这种使用真的没有什么特别的地方,只是我们对于C/C++的理解,巧妙地利用语言特性帮助我们解决一些编程中的问题。

0 篇笔记 写笔记

自旋KSPIN_LOCK
链表之类的结构总是涉及到恼人的多线程同步问题,这时候就必须使用。这里只介绍最简单的自选。有些读者可能疑惑存在的意义。这和多线程操作有关。在驱动开发的代码中,大多是存在于多线程执行环境的。就是说可能有几个线程在同时调用当前函数。这样一来,前文中提及的追加链表节点函数就根本无法使用了。因为My......
磁盘
void CKDiskInitDlg::OnButtonUnlock() { // TODO: Add your control notification handler code here CComboBox* pList =(CComboBox*)GetDlgItem(IDC......
使用临界区封装的自解CAutoLock
自动使用方法://加{ CAutoLock lock(m_MsgSendCriticalSection); //do something}由于使用的是CRITICAL_SECTION,所以只适用于多线程之间的同步,不能适用于多进程的同步。AutoLock.hclass......
删除IO_REMOVE_LOCK与STATUS_DELETE_PENDING
删除IO_REMOVE_LOCK很少见,但很重要。其结构体定义为:typedef struct _IO_REMOVE_LOCK { IO_REMOVE_LOCK_COMMON_BLOCK Common;#if DBG IO_REMOVE_LOCK_DBG_BLOCK Dbg;......
IO_REMOVE_LOCK使用方法小结
IO_REMOVE_LOCK(删除)的具体结构没有公开,WDK的文档中中查不到IO_REMOVE_LOCK。最开始看到IO_REMOVE_LOCK是在WDK的例子event中。下面是参考网上的一些资料之后的一点总结,错误的地方请指正。新增内容:WDK8.1 中是可以看到这个结构的,在wdm.h中。......
C/C++技巧 自动解
在线程或进程的同步时,经常需要用到临界体,互斥体等同步对象,在需要同步的片段开始出使用临界体加EnterCriticalSection,同步对象的结束处加LeaveCriticalSection,当然这样写是没有任何问题的,那有没有更加简单的方法来书写呢?我们可以利用类的构造和析构来进行自动化的加解......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!