假设一个多线程环境和一个(正确同步的)具有一个特定过程的类
procedure SortKeyList (KeyList : TList <Integer>; Inverted : Boolean);
获取密钥列表并对其进行排序。该过程使用RTL快速排序实现TList.Sort:
KeyList.Sort (TComparer <Integer>.Construct (CompareKeys))
现在出现问题:CompareKeys必须访问该类的某些成员才能对列表进行排序(这就是关于这个类的重点)。但RTL要求CompareKeys是正常功能。如何以线程安全的方式将数据从对象传递到CompareKeys函数?显然,使用全局交换变量不是一种选择,因为它绝不是线程安全的。
有什么想法吗?
答案 0 :(得分:4)
您将CompareKeys
传递给TComparer.Construct
的事实意味着CompareKeys
不必须是正常的功能。 Delphi 2009引入了方法引用,它可以引用普通的函数,方法和匿名方法。我假设TComparer.Construct
构造了一个方法引用,而不是你给它的普通函数。 (但我不确定为什么;我认为编译器会自动进行转换。)
假设您有一个三参数函数,它接收一个列表和两个要比较的项目:
function CompareKeys(List: TList<Integer>; Item1, Item2: Integer): Integer;
你应该能够传递一个像这样的匿名方法:
KeyList.Sort(function(Item1, Item2: Integer): Integer;
begin
Result := CompareKeys(KeyList, Item1, Item2);
end);
答案 1 :(得分:2)
也许您可以使用threadvar
(线程局部变量)来保存对您的实例的引用,然后可以从CompareKeys函数访问(在调用Sort之前分配threadvar)。