gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:14:31 25 4
gpt4 key购买 nike

我正在使用线程,这就是我使用互斥锁来锁定共享资源的原因。锁定的基本用法是将资源放入锁定/解锁 block 中。

procedure RefreshData;
begin
DataLock;
GetData;
GetSettings;
CheckValues;
...
DataUnlock;
end;

因为总有一对锁定/解锁,我开始考虑简化的锁定/解锁方法,该方法可以在不再需要时自动解锁资源。

所以我的想法是引入新的过程,它将对过程的引用作为输入参数。这将使我能够使用匿名方法。

代码类似于:

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 - 使用单个命令锁定和解锁资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27035179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com