【问题标题】:Compare Function and Multithreading比较函数和多线程
【发布时间】:2009-04-01 12:33:29
【问题描述】:

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

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

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

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

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

对此有什么想法吗?

【问题讨论】:

    标签: multithreading delphi sorting delphi-2009 callback


    【解决方案1】:

    您将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)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多