Primož Gabrijelčič [email protected] [email protected] http://thedelphigeek.com grafika: Flickr / Gamma-Ray Productions Embarcadero Akademija Večnitno programiranje Embarcadero Akademija Večnitno programiranje Urnik 09.00 – 10.30 10.30 – 11.00 11.00 – 12.30 12.30 – 13.00 osnove večnitnega programiranja, Delphi.

Download Report

Transcript Primož Gabrijelčič [email protected] [email protected] http://thedelphigeek.com grafika: Flickr / Gamma-Ray Productions Embarcadero Akademija Večnitno programiranje Embarcadero Akademija Večnitno programiranje Urnik 09.00 – 10.30 10.30 – 11.00 11.00 – 12.30 12.30 – 13.00 osnove večnitnega programiranja, Delphi.

Primož Gabrijelčič
[email protected]
[email protected]
http://thedelphigeek.com
grafika: Flickr / Gamma-Ray Productions
Embarcadero Akademija
Večnitno programiranje
Embarcadero Akademija
Večnitno programiranje
Urnik
09.00 – 10.30
10.30 – 11.00
11.00 – 12.30
12.30 – 13.00
osnove večnitnega programiranja,
Delphi in niti
odmor
OmniThreadLibrary
kosilo
Embarcadero Akademija
Večnitno programiranje
Večnitno programiranje (multithreading)
Embarcadero Akademija
Večnitno programiranje
“New programmers
are drawn to multithreading
like moths to flame,
with similar results.”
-Danny Thorpe
Embarcadero Akademija
Večnitno programiranje
Procesi in niti
• Proces = naložen program + sredstva (pomnilnik,
datoteke …)
• Knjigovodski opis programa
• Nit = stanje izvajanja
• Vsebina registrov
• Sklad
• Pomnilniške lokacije, vezane na nit
Embarcadero Akademija
Procesi in niti
• Obstaja glavna nit
• Dodamo lahko nove niti
• »Težki« procesi
• »Lahke« niti
Večnitno programiranje
Embarcadero Akademija
Procesi in niti
Večnitno programiranje
Embarcadero Akademija
Večopravilnost in večnitnost
• Kooperativna večopravilnost
• Predkupna večopravilnost
Večnitno programiranje
Embarcadero Akademija
Večnitno programiranje
Zakaj?
© Herb Sutter, www.gotw.ca/publications/concurrency-ddj.htm
Embarcadero Akademija
Kdaj?
• Izvajanje dolgotrajnega opravila v ozadju
• Izvajanje več opravil hkrati
• Strežnik
• Pospešitev postopka
• Primerni in neprimerni postopki
Večnitno programiranje
Embarcadero Akademija
Večnitno programiranje
VCL ne sodi v dodatne niti!
Embarcadero Akademija
Večnitno programiranje
Skupni podatki
• Preberi, spremeni, zapiši / preberi, spremeni, zapiši
• Zapiši / preberi
Embarcadero Akademija
Atomarne spremembe
• Zaklepanje
• Kritična sekcija
• Muteks
• Semafor
• Operacije »interlocked«
• Increment/decrement
• InterlockedExchange
• InterlockedCompareExchange
Večnitno programiranje
Embarcadero Akademija
Zaklepanje prinese nove težave
• Mrtve zanke
• Žive zanke
• Upočasnitev delovanja
Večnitno programiranje
Embarcadero Akademija
Večnitno programiranje
Sinhronizacijski primitivi
• SyncObjs / Windows
• TCriticalSection / InitializeCriticalSection
• TMutex / CreateMutex
• TSemaphore / CreateSemaphore
• TCountdownEvent
• TEvent / CreateEvent
• TSpinLock / InitializeCriticalSectionAndSpinCount
• TMultiReadExclusiveWriteSynchronizer [SysUtils]
• [Msg]WaitForMultipleObjects[Ex]
Embarcadero Akademija
Večnitno programiranje
Komunikacija
• TEvent
• Windows sporočila
• TCP
• Skupni pomnilnik z atomarnimi spremembami
Embarcadero Akademija
Delphi in niti
Večnitno programiranje
Embarcadero Akademija
TThread
• Classes
• type
TTestThread1 = class(TThread)
procedure Execute; override;
end;
Večnitno programiranje
Embarcadero Akademija
Create/Destroy
• FThread1 := TTestThread1.Create;
• FThread1.Terminate;
FThread1.WaitFor;
FreeAndNil(FThread1);
Večnitno programiranje
Embarcadero Akademija
Večnitno programiranje
FreeOnTerminate
FThread2 := TTestThread2.Create(true);
FThread2.FreeOnTerminate := true;
FThread2.OnTerminate := ReportThreadTerminated;
Embarcadero Akademija
Večnitno programiranje
TThread.Execute
procedure TTestThread1.Execute;
begin
while not Terminated do begin
// some real work could be done here
end;
end;
Embarcadero Akademija
Pomembne metode
• CreateAnonymousThread
• Synchronize, Queue
• ReturnValue
• FatalException
• Handle, ThreadID, Priority
Večnitno programiranje
Embarcadero Akademija
Večnitni RTL
• SyncObjs
• TThreadList
• TThreadedQueue
• TMonitor
• threadvar
Večnitno programiranje
Embarcadero Akademija
Alternative
• AsyncCalls
http://andy.jgknet.de
• OmniThreadLibrary
http://otl.17slon.com
Večnitno programiranje
Embarcadero Akademija
Razhroščevanje
• Thread Status
• Breakpoint
Večnitno programiranje
Embarcadero Akademija
Nasveti
• Testirajte!
• Ali uporabljate pravi algoritem?
• Zaklepajte kar najmanjše delčke kode
• Uporabljajte več kritičnih sekcij
• Uporabljajte preizkušene knjižnice
Večnitno programiranje
Embarcadero Akademija
OmniThreadLibrary
Večnitno programiranje
Embarcadero Akademija
Večnitno programiranje
OmniThreadLibrary
• VCL za večnitno programiranje
• Poenostavitev programerskih opravil
• Komponentne rešitve
• Dostop do najnižjih nivojev
• Večnitno programiranje za smrtnike
• Dobro preizkušene komponente v enostavno
uporabljivih razredih
• Večnitno programiranje danes!
Embarcadero Akademija
Status
• Licenca OpenBSD
• Aktivno razvijano
• Revizija 1172
• Različica 3.01 izdana 21. aprila
• Veliko uporabnikov
• 2.0: 2710 prenosov [7 mesecev]
• 3.0: 1816 prenosov [4 meseci]
• Delphi 2007 in novejši
• Win32 in Win64
Večnitno programiranje
Embarcadero Akademija
Večnitno programiranje
Namestitev
• Omnithreadlibrary.googlecode.com
• Zip
• SVN
• Namestitvena pot + »src« => Library Path
• OtlTask, OtlTaskControl, OtlParallel => uses
Embarcadero Akademija
Opravila in niti
Večnitno programiranje
Embarcadero Akademija
Večnitno programiranje
Komunikacija
• Komunikacija ima prednost pred zaklepanjem
• Vgrajene komunikacijske vrste
• Olajšano pošiljanje sporočil
• Monolitna zanka za obdelavo sporočil
• Samodejno razpošiljanje sporočil do prave metode
• message
Embarcadero Akademija
Nizkonivojsko nitenje
Večnitno programiranje
Večnitno programiranje
Embarcadero Akademija
Najpomembnejši gradniki
• OtlTask
• IOmniTask
• OtlTaskControl
• IOmniTaskControl
• OtlCommon
• TOmniValue
• Environment
• OtlContainers
• TOmniBoundedStack
• TOmniBoundedQueue
• TOmniQueue
• OtlSync
• TOmniCS
• TOmniMREW
• Locked<T>
Embarcadero Akademija
IOmniTaskControl
• 51 metod
• 10 lastnosti
• Zagon in zaustavitev
• Parametri
• Komunikacija
• Časovniki
• Izjeme
Večnitno programiranje
Embarcadero Akademija
Večnitno programiranje
Minimalni program
procedure TfrmTestSimple.btnBeepClick(Sender: TObject);
begin
CreateTask(Beep, 'Beep').Run;
end;
procedure TfrmTestSimple.Beep(const task: IOmniTask);
begin
MessageBeep(MB_ICONEXCLAMATION);
end;
Embarcadero Akademija
Večnitno programiranje
Tekoče programiranje
FHelloTask := CreateTask(TAsyncHello.Create(), 'Hello')
.SetParameter('Delay', 1000)
.SetParameter('Message', 'Hello')
.OnMessage(Self)
.OnTerminated(
procedure
begin
lbLog.Items.Add('Terminated');
end)
.Run;
Embarcadero Akademija
Visokonivojsko nitenje
Večnitno programiranje
Embarcadero Akademija
Zakaj?
• Načrtovanje večnitnih postopkov je težko
• Pisanje večnitne kode je težko
• Testiranje večnitne kode je težko
• Razhroščevanje večnitne kode je
grozljivka
Večnitno programiranje
Večnitno programiranje
Embarcadero Akademija
Abstrakcije
• Async
• ForEach
• Future
• Pipeline
• Join
• ForkJoin
• ParallelTask
• BackgroundWorker
Večnitno programiranje
Embarcadero Akademija
Async
• Parallel.Async(code)
Async
(code)
code
Embarcadero Akademija
Večnitno programiranje
Future
• Future:=
Future
(code)
Parallel.Future<tip>
(calculation);
• Value := Future.Value;
code
.Value
Result
Večnitno programiranje
Embarcadero Akademija
Join
• Parallel.Join([task1, task2, task3, …
taskN]).Execute
Join(code1,
code2, code3)
code1
code3
code2
Večnitno programiranje
Embarcadero Akademija
ParallelTask
• Parallel.ParallelTask.Execute(code)
ParallelTask
(code)
code
code
code
Embarcadero Akademija
ParallelFor
• Parallel.ForEach(from, to).Execute(
procedure (const value: integer);
begin
//…
end);
• Parallel.ForEach(source).Execute(
procedure (const value: TOmniValue) …
• Parallel.ForEach<string>(source).Execute(
procedure (const value: string) …
Večnitno programiranje
Večnitno programiranje
Embarcadero Akademija
source
ForEach
(source, code)
code
code
code
Optional
output
Večnitno programiranje
Embarcadero Akademija
Pipeline
• Parallel.Pipeline([stage1, stage2, stage3]).Run
Pipeline(source,
stage1, stage2,
stage3)
source
stage1
temp1
temp2
stage3
stage2
output
Embarcadero Akademija
Pipeline - primer
Večnitno programiranje
while <has data>
read <data>
insert <data> into <compress queue>
while
<compress
queue> queue>
readread
<data-c>
from <compress
<data>
compress
<data-c>
while
<has data>
<data>into
into
<encrypt
queue>
insert<data>
<data-c>
into
<encrypt
queue>
<read-buf>
read
<read-buf> into <compress-buf>
compress <data>
while
<encrypt
readread
<data-e>
fromqueue>
<encrypt
queue>
<compress-buf>
into <encrypt-buf>
encrypt
<data>
<data>
encrypt
<data-e>
<encrypt-buf>
write <data>
<data> into
<write
queue>
insert <data-e>
into
<write
queue>
while
<writefrom
queue>
readread
<data-w>
<write queue>
<data>
write <data-w>
Večnitno programiranje
Embarcadero Akademija
ForkJoin
computation
pool
• Deli in vladaj
code
ForkJoin
(code)
code
code
Embarcadero Akademija
BackgroundWorker
Večnitno programiranje