DelphiThreadVar是否适用于Parallel.for?

DelphiThreadVar是否适用于Parallel.for?,delphi,Delphi,从上面说 “ThreadVar关键字启动一组变量定义,这些变量定义是 由线程使用。每个线程都有一个单独的实例 变量,从而避免数据冲突,并保留线程 独立性。” 那么我可以并行使用吗?像这样 threadvar threadID: integer; procedure TForm5.Button1Click(Sender: TObject); var Tot: Integer; begin TParallel.For(1, Max, procedure (I: Integer)

从上面说

“ThreadVar关键字启动一组变量定义,这些变量定义是 由线程使用。每个线程都有一个单独的实例 变量,从而避免数据冲突,并保留线程 独立性。”

那么我可以并行使用吗?像这样

threadvar
    threadID: integer;

procedure TForm5.Button1Click(Sender: TObject);
var
 Tot: Integer;
begin
 TParallel.For(1, Max, procedure (I: Integer)
   begin
     threadID := i;  // each thread gets its own threadID?
     if IsPrime (threadID) then
       TInterlocked.Increment (Tot);
   end);
end;

您当然可以将
threadvar
与PPL代码一起使用。在内部,PPL代码位于系统线程库的顶部,因此
threadvar
可以正常工作。

可以:):)FWIW,现在习惯使用
AtomicIncrement
而不是
TInterlocked.Increment
,因为这是一个内在的函数,可以内联扩展到高效的平台特定代码。TInterlocked.Increment是一个内联函数,它扩展到TInterlocked.Add,然后扩展到AtomicIncrement,正如您所说,扩展到特定于内联平台的机器代码。在这种情况下,TInterlocked.Increment最终将是同一件事。因此,您最好避免对内联引擎施加压力,直接进入马口。另外它读起来更好。@DavidHeffernan当然。让你的船漂浮的东西。我的观点是TInterlocked。增量同样有效。您的评论暗示了其他情况。从技术上讲,您是正确的,threadvar可以很好地处理TParallel.for使用的线程池中的线程。然而,如何将任务调度到这些线程上是不可预测或不稳定的。当线程池中的线程失效时,threadvar随时都可能消失。@Allen这几乎使线程变量在使用基于任务的接口时变得无用,对吗?@DavidFeffernan我不认为它无用。您只需要在每个任务开始时对其进行初始化。@Allen我看不出如何从正在该线程中忙于执行的任务下提取线程,或者我误解了您的评论。threadvar不会在不同的任务之间执行,这是有道理的。@grayment这是我的观点。。。如果线程变量在任务中是不可预测的,为什么还要麻烦呢?