H IGH - LEVEL M ULTITHREADED P ROGRAMMING [P ART II] Primož Gabrijelčič
B ACKGROUND I NFORMATION
About Me Primož Gabrijelčič Programmer, consultant, writer, speaker – thedelphigeek.com – Hacking multithreaded code since 1999
About OmniThreadLibrary „VCL for multithreading“ Delphi 2007 – XE3[4] Open source – OpenBSD license – – omnithreadlibrary.googlecode.com Win32/Win64
About the Webinars Code and video: Code = free, video = $10 20 free books, courtesy of the De Novo Software,
High-Level Abstractions Async [/Await] Future Join ForEach ParallelTask BackgroundWorker ForkJoin Pipeline
High-Level Abstractions Async [/Await] Future Join ForEach ParallelTask BackgroundWorker ForkJoin Pipeline Start multiple background tasks [and wait]
Join
High-Level Abstractions Async [/Await] Future Join ForEach ParallelTask BackgroundWorker ForkJoin Pipeline Start multiple copies of a single task
ParallelTask
High-Level Abstractions Async [/Await] Future Join ForEach ParallelTask BackgroundWorker ForkJoin Pipeline Background request-processing service
Background Worker
BackgroundWorker Usage service := Paralell.BackgroundWorker. OnRequestDone(code1).Execute(code2); workItem := service.CreateWorkItem(data); service.Schedule(workItem) service.Terminate; service := nil;
High-Level Abstractions Async [/Await] Future Join ForEach ParallelTask BackgroundWorker ForkJoin Pipeline Divide and conquer
Fork/Join
Fork/Join Usage computation := Parallel.ForkJoin; compute1 := computation.Compute(action); – Inside action: computation.Compute(newAction) compute2 := computation.Compute(action); compute1.Value / compute1.Await compute2.Value / compute2.Await
P ARTING N OTES
Keep in Mind Don’t parallelize everything Rethink the algorithm Data flow dictates the abstraction Measure the improvements Test, test and test
Code & Video Will be available shortly at