delphi – 使用单个命令锁定和解锁资源
发布时间:2020-12-15 09:45:40 所属栏目:大数据 来源:网络整理
导读:我正在使用线程,这就是我使用互斥锁来锁定共享资源的原因.锁定的基本用法是将资源放在Lock / unlock块中. procedure RefreshData;begin DataLock; GetData; GetSettings; CheckValues; ... DataUnlock;end; 因为总有一对锁定/解锁我开始考虑简化锁定/解锁方
我正在使用线程,这就是我使用互斥锁来锁定共享资源的原因.锁定的基本用法是将资源放在Lock / unlock块中.
procedure RefreshData; begin DataLock; GetData; GetSettings; CheckValues; ... DataUnlock; end; 因为总有一对锁定/解锁我开始考虑简化锁定/解锁方法,这将在不再需要时自动解锁资源. 所以我的想法是引入新程序,该程序将输入参数作为对precedure的引用.这将使我能够使用匿名方法. 代码将是这样的: type TBaseProc = reference to procedure; procedure TMyObject.LockMethod(AMeth: TBaseProc); begin DataLock; try AMeth; finally DataUnlock; end; end; procedure TForm1.RefreshData; begin MyObject.LockMethod( procedure begin GetData; GetSettings; CheckValues; ... end; ); end; 这种方法有任何意义,还是有更好甚至更简单的解决方案? 感谢致敬. 解决方法
这种方法远非完美,因为正如我从您的代码中所理解的那样,每个应用程序只有一个锁.当每个独立数据实体都有自己的锁时,它会更好.所以你会有一个像这样的抽象类:
type TAbstractData = class private CriticalSection: TRtlCriticalSection public constructor Create; procedure Lock; procedure Unlock; destructor Destroy; override; end; 然后从这个实现锁定的抽象类继承其他类. constructor TAbstractData .Create; begin inherited Create; InitializeCriticalSection(CriticalSection); end; procedure TAbstractData.Lock; begin EntercriticalSection(CriticalSection); end; procedure TAbstractData.Unlock; begin LeaveSection(CriticalSection); end; procedure TAbstractData.Destroy; begin DeleteCriticalSection(CriticalSection); inherited Destroy; end; CriticalSection是迄今为止在Windows中实现的最有效的同步分支.它几乎是免费的 – 除非存在线程争用,否则几乎不消耗任何系统资源,并且当只有一个线程使用数据时不会调用昂贵的上下文切换. 在我提交答案后,我在互联网上发现了一篇好文章 – http://blog.synopse.info/post/2016/01/09/Safe-locks-for-multi-thread-applications – 作者推荐了类似的方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |