2017-02-01 28 views
11

oDelphi threadvar Parallel.For için çalışıyor mu? <a href="http://www.delphibasics.co.uk/RTL.asp?Name=ThreadVar">here</a> den

"ThreadVar anahtar parçacığı tarafından kullanılmaktadır değişken tanımları kümesini başlar diyor. Her iplik, böylece veri çakışmaları kaçınarak ve iplik koruyarak her değişkenin ayrı bir örneğini verilir bağımsızlık. "

Yani böyle Parallel.For kullanabilirim?

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; 
+0

evet yapabilirsin :) :) – loki

+3

FWIW, bu günlerde 'TInterlocked.Increment' yerine 'AtomicIncrement' kullanmak yerine deyimseldir çünkü bu, etkin bir platform özel kod satırında genişleyen içsel bir özelliktir. –

+2

TInterlocked.Increment, TInterlocked.Add öğesine genişleyen, daha sonra AtomicIncrement öğesine genişleyen ve buna paralel olarak, platforma özgü makine koduna satır içi genişleyen satır içi bir işlevdir. Bu durumda, TInterlocked.Increment aynı şey olacak. –

cevap

7

threadvar'u PPL koduyla kullanabilirsiniz. Dahili olarak, PPL kodu, sistem iş parçacığı kitaplıklarının üstünde durur ve threadvar beklediğiniz gibi çalışır.

+1

Teknik olarak, threadvar'ın TParallel.For için kullanılan threadpool içindeki iş parçacıklarıyla düzgün çalışacağından emin olabilirsiniz. Ancak, görevlerin bu iş parçacıklarına nasıl planlandığı, öngörülebilir veya kararlı bir şeydir. Threadvar'daki dişler emilirken, threadvar herhangi bir zamanda ortadan kalkabilir. –

+0

@Allen Görev esaslı bir arabirim ile çalışırken, hemen hemen iş parçacığı işe yaramaz hale gelir. –

+0

@DavidHeffernan Bunun yararsız olduğunu sanmıyorum. Her görevin başlangıcında bunu başlatmanız yeterlidir. – Graymatter

İlgili konular