比较函数和多线程

时间:2009-04-01 12:33:29

标签: multithreading delphi sorting delphi-2009 callback

假设一个多线程环境和一个(正确同步的)具有一个特定过程的类

procedure SortKeyList (KeyList : TList <Integer>; Inverted : Boolean);

获取密钥列表并对其进行排序。该过程使用RTL快速排序实现TList.Sort:

KeyList.Sort (TComparer <Integer>.Construct (CompareKeys))

现在出现问题:CompareKeys必须访问该类的某些成员才能对列表进行排序(这就是关于这个类的重点)。但RTL要求CompareKeys是正常功能。如何以线程安全的方式将数据从对象传递到CompareKeys函数?显然,使用全局交换变量不是一种选择,因为它绝不是线程安全的。

有什么想法吗?

2 个答案:

答案 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)。