TWorkStealingQueue的目的是什么以及如何使用它?

πάν*_*ῥεῖ 7 delphi multithreading threadpool

我正在开发一个程序来从可能很大的目录结构中迁移文件,其中很多都是(大约100万).
我的迁移代码已经运行良好,我正在使用一个类迭代到目录结构,识别文件以一个接一个地顺序迁移它们.

现在,我希望更好地利用目标计算机的可用CPU资源,并进行这些迁移异步从a中获取线程System.Threading.TThreadPool以执行这些操作.

我非常了解ITask界面,以及如何使用TTask设置任务的数组,这些任务将与TThreadPool实例一起管理.
虽然建立一个大TArray<ITask>阵列,并等待完成时,所有的目录都走透,只是似乎是不恰当的和低效的方法(尤其是在内存占用方面).

我认为我需要的只是拥有一个简单的线程安全的生产者/消费者队列,当工作线程可用于使用任务并完成它们时,它会增长和缩小.

现在我在Emba文档中发现了一些看起来很有前途的东西,称为a TWorkStealingQueue,但是通常情况下,文档很差,缺乏如何使用它的简洁示例.

它会归结为类似的东西

TMigrationFileWalker = class(TFileWalker) 
strict private
    var
       FPendingMigrationTasks : TArray<ITask>;

    function createMigrationTask(const filename : string) : ITask;
strict protected
    procedure onHandleFile(const filename : string); override;
public
    procedure walkDirectoryTree(const startDir : string); override;
end;

implementation

procedure TMigrationFileWalker.onHandleFile(const filename : string);
var
    migrationTask : ITask;
begin
    migrationTask := createMigrationTask(filename);
    self.FPendingMigrationTasks := self.FPendingMigrationTasks + [migrationTask];
    migrationTask.Start();
end;

procedure walkDirectoryTree(const startDir : string);
begin
    inherited walkDirectoryTree(startDir);
    TTask.WaitForAll(self.FPendingMigrationTasks,SOME_REASONABLE_TIMEOUT);
end;
Run Code Online (Sandbox Code Playgroud)

当然,我可以拥有一个线程安全的PC队列,并管理一堆线程.但它承诺它适用于线程池,我想利用随之而来的已有的负载平衡机制.

是否有人在这里使用过TWorkStealingQueue,并且可以给出一个简短的例子,如何在上述情况下使用它?或者至少澄清一下这个课程的实际目的是什么,以防我从命名中完全误解了?

一项研究TWorkStealingQueue没有产生任何更好的结果,而是重定向到Embarcadero文件不足.