delphi – 使用单个命令锁定和解锁资源

delphi – 使用单个命令锁定和解锁资源,第1张

概述我正在使用线程,这就是我使用互斥锁来锁定共享资源的原因.锁定的基本用法是将资源放在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 – 作者推荐了类似的方法.

总结

以上是内存溢出为你收集整理的delphi – 使用单个命令锁定和解锁资源全部内容,希望文章能够帮你解决delphi – 使用单个命令锁定和解锁资源所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1271505.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存