Nix*_*Nix 5 delphi mutex locking anonymous-function delphi-xe6
我正在使用线程,这就是我使用互斥锁来锁定共享资源的原因.锁定的基本用法是将资源放在Lock/unlock块中.
procedure RefreshData;
begin
DataLock;
GetData;
GetSettings;
CheckValues;
...
DataUnlock;
end;
Run Code Online (Sandbox Code Playgroud)
因为总有一对锁定/解锁我开始考虑简化锁定/解锁方法,这将在不再需要时自动解锁资源.
所以我的想法是引入新程序,该程序将输入参数作为对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;
Run Code Online (Sandbox Code Playgroud)
这种方法有任何意义,还是有更好甚至更简单的解决方案?
感谢致敬.
这种方法远非完美,因为正如我从您的代码中了解到的那样,每个整个应用程序都有一个锁。当每个独立的数据实体都有自己的锁时会更好。所以你会有一个像这样的抽象类:
type
TAbstractData = class
private
CriticalSection: TRtlCriticalSection
public
constructor Create;
procedure Lock;
procedure Unlock;
destructor Destroy; override;
end;
Run Code Online (Sandbox Code Playgroud)
然后从这个实现锁定的抽象类继承其他类。
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;
Run Code Online (Sandbox Code Playgroud)
ACriticalSection是Windows中实现的最高效的同步类。它实际上是免费的——除非存在线程争用,否则几乎不消耗任何系统资源,并且当只有一个线程使用数据时不会调用昂贵的上下文切换。
我提交答案后,在网上找到了一篇不错的文章 - http://blog.synopse.info/post/2016/01/09/Safe-locks-for-multi-thread-applications - 作者推荐类似的方法。
| 归档时间: |
|
| 查看次数: |
766 次 |
| 最近记录: |