加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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 – 作者推荐了类似的方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读