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 ReportTranscript 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