多线程中有关线程锁的简化应用。
来源:互联网 发布:中国出口数据统计 编辑:程序博客网 时间:2024/06/05 15:43
在网上无意间看到了一个关于C++的用临界区解决线程同步的方案,感觉作者设计的很巧妙。于是转成delphi代码:
先看作者的设计方法:
class CLock { private: CRITICAL_SECTION m_section; public: CLock(void) { InitializeCriticalSection(&m_section); } ~CLock(void) { DeleteCriticalSection(&m_section); } void lock() { EnterCriticalSection(&m_section); } void unLock() { LeaveCriticalSection(&m_section); } };
你可以这样使用:
CLock lock;void test(){ lock.lock(); // do something..... lock.unlock();}
如果忘记使用unlock来解锁的话,就会导致死锁。
分析可知道 在函数返回的时候必须要解锁 所以如果能监听到函数返回就好了
高手们提供了下面的辅助类:
class CAutoLock { private: CLock * m_pLock; public: CAutoLock(CLock * pLock) { m_pLock = pLock; pLock->lock(); } ~CAutoLock() { m_pLock->unLock(); } };
这样使用的时候就不用担心少写了unlock造成死锁, 有点智能指针的味道。
CLock lock;void test(){ CAutoLock lock(&lock); //do something;}
根据以上思路,翻译成delphi:
type TLock=class private v_section:TRTLCriticalSection; procedure lock; procedure unlock; public constructor Create(); destructor Destroy; override; end; PTLock=^TLock; TLockEx=class(TLock) private v_lockex:PTLock; public constructor Create(lockex:PTLock); destructor Destroy; override; end;implementationconstructor TLock.Create();begin InitializeCriticalSection(v_section);end;destructor TLock.Destroy;begin DeleteCriticalSection(v_section); inherited;end;procedure TLock.lock;begin EnterCriticalSection(v_section); end;procedure TLock.unlock;begin LeaveCriticalSection(v_section);end;constructor TLockEx.Create(lockex:PTLock);begin v_lockex :=lockex; v_lockex^.lock;end;destructor TLockEx.Destroy;begin v_lockex^.unlock; inherited;end;
可以如下调用:
var v_locks:TLock;procedure tests();var p_lock:TLockEx;begin p_lock:=TLockEx.Create(@v_locks); //do something FreeAndNil(p_lock);end;
- 多线程中有关线程锁的简化应用。
- 有关Python中线程的超时控制以及一个简单的应用
- java面试中有关多线程的试题
- linux多线程编程(有关线程操作的函数)
- C++多线程——有关线程Sentry的一种用法
- 有关Java中线程池的介绍
- 多线程中,java锁的应用
- 多线程之线程池的应用
- 多线程之线程池的应用
- 多线程之线程池的应用
- 多线程之线程池的应用
- 进程与线程,java多线程的应用
- 有关str的函数应用。。。。。完善中
- MFC中多线程的应用
- MFC中多线程的应用
- MFC中多线程的应用
- MFC中多线程的应用
- MFC中多线程的应用
- IAR中通过ICF指定某变量的地址 或者 通过语句指定
- Make sure DBMS client is installed and this required library is available for dynamic loading
- Execl相关操作
- Session 基础知识 生命周期
- <MFC>打开文件和保存文件对话框
- 多线程中有关线程锁的简化应用。
- linux中程序的观察
- Android记录9--实现转盘效果
- Android开发 重启运用程序的代码
- 时尚的CSS3进度条
- 普通表 分区表 大对象表之间不同的segment分配
- 2014百度校园招聘研发一面
- ubuntu自动安装 nginx后 文件结构及位置
- php 执行shell命令的函数