• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    TENCOKACISTROMYProgramovani v C#, F# a dalsich jazycich pro .NET, Mono a ostatni CLI implementace
    SLUPKA
    SLUPKA --- ---
    ANDY_WARHOL: jo, tak s tím souhlasím... pak už je to jen o tom, kde je ta hranice, co by člověk měl znát (neříkám detailně, ale alespoň aby věděl přesně co googlit) a co už je moc konkrétní...
    ANDY_WARHOL
    ANDY_WARHOL --- ---
    SLUPKA: jen si nepochopil jak sem to myslel. ME by u najimaneho programátora spis zajimalo, zda umí vymyslet řešení neboli algoritmizovat, než jestli zná nějakou zcela konkrétní věc, protože to ze by něco dokázal vypsat z ruky v žádném případě ne indikuje, ze by byl v reálné praxi použitelnější než ten co by to nevypsal.
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    Mimochodem - semafory v .NETu nezajistujou poradi pristupu threadu ktery cekaji.
    Sam jsem to do dneska nevedel. Budiz mi omluvou, ze je nepouzivam.

    Nekdy to je fuk, ale zrovna u fronty bych rekl ze to muze byt problem.
    SLUPKA
    SLUPKA --- ---
    Sry, já jsem si to blbě přečetl, co bylo za zadání. Jsem myslel, že má frontu s omezenou kapacitou. Pokud jen frontu, tak lock (semafor velikosti 1) to řeší. Případně kdybys udělal vlastní implementaci fronty (třeba spojákem), tak to uděláš thread safe, kde se zápis / čtení budou ovlivňovat jen při práci se (skoro) prázdnou frontou, což ti semafor přesně vyřeší...
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    TENCOKACISTROMY: Tim nepomoci semaforama jsem mel na mysli oproti locku. Semaforama to samozrejme vyresit lze.
    PIGSTER
    PIGSTER --- ---
    SLUPKA: me prijde reseni TCKS naprosto OK, semafor je v tomhle pripade trochu zavadejici, ale porad teda pouzitelnej (i kdyz reseni pres lock je rozhodne bezpecnejsi co do moznosti nasekat tam chyby). K fronte muze soucasne pristupovat jenom jeden proces, takze semafor bude muset mit maximalni hodnotu 1 (u bezny .net queue nejde zarucit, ze paralelni cteni, nebo zapisy neskonci spatne). To je jedna polovicka problemu. Ta druha jsou waity a tam je pokud jsem se spravne dival v .netu trochu problem, protoze neni synchronyzacni primitivum, ktery by se chovalo jako WaitHandle s counterem, umi jenom bit. Takze krome WaitHandle jeste budu potrebovat threadsafe counter, kam se musim podivat pred tim, nez locknu na wait - pokud je counter vetsi nez nula, dekrementuju, necekam, zpracovavam frontu, pokud je nula, blokuju na wait - producent opacne (pri pridavani do fronty inkrementuje counter a releasuje wait). Lockovani fronty je dulezity, pokud se sejdou 2 a vice konzumentu najednou a ve fronte je pro ne dost prace. Ta druha vopicarna (counter a wait) je kvuli blokovani konzumentu, pokud nemaj co delat (fronta je empty) - blokovani producenta je out of scope tohohle zadani, protoze buh vi odkad ten co produkuje (treba neblokuje vubec a bezi v nekonecny smycce na max rychlosti). Pokud nekdo vi jedno primitivum, ktery vyresi ty waity bez countru (teda ma ten counter v sobe) tak sem s nim.
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    SLUPKA: Vzhledem k tomu, ze jen obaloval obycejnou queue, tak si se semaforama nijak nepomuzes. Oboje dvoje operace jsou zapisovaci a menej stav, takze potrebujes vsechny ostatni vlakna zastavit.
    Jina situace uz je u metody Peek() - ta je ciste cteci. V tu chvili by byly k necemu dobry. Ale na druhou stranu v .NETu existuje trida ReaderWriterLockSlim, ktera tohle umi resit docela pohodlne.

    A to cele samozrejme neni vsechno. Ten "lock(x) { ... }" ma velkou vyhodu v tom, ze to je syntax-suger s Monitor.Enter(), Monitor.Exit() a to spolecne s "try { ... } finally { ... }". Takze neocekavana vyjimka to cely nerozbije.

    Ovsem to stale neni odolne proti situaci kdy nejaky "chytrak" zavola Thread.Abort() na dotycnem vlakne (z jineho vlakna samozrejme). Protoze ten syntax sugar je v poradi:
    1) Enter
    2) Try
    2.1) ... body ...
    3) Finally
    3.1) Exit

    Takze kdyz se vyhozeni ty ThreadAbortException trefi mezi 1. a 2. bod, stale se to muze rozbit. (Samozreme volani Thread.Abort() na jinem vlakne nez na vlastnim je prasarna a dokonce to ani nezarucuje, ze ten thread skonci.)

    Kdyz uz jsme teda u toho, nedavno jsem se tu ptal na codereview my extension metody, ktera by tohle vsechno mela resit. Tak jestli bych mohl poprosit tebe - koukni na to: http://codereview.stackexchange.com/questions/18908/extension-methods-for-readerwriterlockslim
    P19
    P19 --- ---
    SLUPKA: Díky. Přečtu si to a půjdu asi zametat...dám na rady moudřejších.
    SLUPKA
    SLUPKA --- ---
    TENCOKACISTROMY: za tohle by ho asi vyhodili, nebo tedy, pokud bych mu dal takové zadání já a on mi dal, to co ty, tak by šel určitě :))
    ANDY_WARHOL: detaily? proč by programátor neměl mít alespoň nejpovrchnější základy? ono google je super, ale když nic nevíš, tak jak poznáš, že to co jsi vygooglil není špatně? zrovna u vícevláknových věcí ty chyby nejsou vidět až tak přímočaře...
    P19: Tohle je úloha, která je na snad na každém začátku vysvětlování semaforů...
    Producer-consumer problem - Wikipedia, the free encyclopedia
    http://en.wikipedia.org/wiki/Producer-consumer_problem
    ANDY_WARHOL
    ANDY_WARHOL --- ---
    TENCOKACISTROMY: popsal si to krásně. jenže to sou ty zkusenosti co se jinak než praxi nenaucis. ovsem ty základní věcí se naučit daji poměrně lehce
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    ANDY_WARHOL: Coz v pripade kdy zakaznik nema nejmensi paru co po nem chces, analytik ti rekne tady jsou pravidla podle nich to udelej, tak stejne pak musis prijit s implementaci, ktera to nakonec resi.

    A kdyz priste budes neco takovyho delat, tak si uvedomis na co vsechno narazis a rovnou jim to rovnou omlatis o hlavu jako nedostatecny zadani a nebo se na to aspon patricne v kodu pripravis. Tak jako tak je to dusledek "nauceni se" prace v multithreadovym prostredi.
    ANDY_WARHOL
    ANDY_WARHOL --- ---
    TENCOKACISTROMY: vsak já Te chápu. ale pokud se má implementovat například to mergovani, tak analytik proste musí dat pravidla. ty mu je samozřejmě můžeš navrhnout, odmitnout , podrobit kritice ale je to on, kdo to do Te analyzi musí dat a dostat na to případně souhlas zákazníka.
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    ANDY_WARHOL: Jako by si to neznal - dostanes zadani a tohle nikoho nenapadlo. Pak na to narazis a co s tim mas delat? Nejak to vyresit musis a ti co ti davaji zadani si s tim rady nevedi :).
    ANDY_WARHOL
    ANDY_WARHOL --- ---
    TENCOKACISTROMY: tak ja sem tu byl první kdo se nad tim podivil.
    a co se Tyce toho druhého, to co naznacujes vůbec netvrdim. nicméně to co si psal je už spis Business čase než úloha z programování.
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    ANDY_WARHOL: No me pripada blbost se na tu thread-safe frontu na pohovu ptat. Tam si proste vystaci s lockama. A naucit se to da za deset minut.

    Nicmene s tou analyzou a programovanim - myslim, ze koncept kdy programator neanalyzuje a analytik neprogramuje, je cesta do pekel. Ve vysledku mas zprasenej kod (mimo dohled analytika), kterej se +- snazi dodrzet zadanou analyzu (tak, aby to QA oddeleni schvalilo).
    ANDY_WARHOL
    ANDY_WARHOL --- ---
    TENCOKACISTROMY: no dobře. ale to co ty popisujes se na nějakým po hovoru asi řešit nebude. to totiž hlavně musí vyřešit analýza projektu (michas tu totiž busines logiku s programováním, protože to jestli se to má mergnout a případně jak není věc peogramovani ale bc logiky). a naučit se ty hlavni zásady skutečně víc jak precist pojednáni nevyžaduje.
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    TENCOKACISTROMY: Navic se to temer neda automaticky testovat.
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    ANDY_WARHOL: Predevsim:
    1) Nevytvorit si z te multithreadove aplikace aplikaci, ktera bezi ve vice threadech ale seriove (kvuli lockum).
    2) Deadlocky.

    A ted si predstav, ze se ti o jedny zdroje pere vic vlaken, kazdy je dulezity a kazdy musis stihnout do nejaky casu vyresit, protoze jinak skoncis na timeoutech u externich zdroju (vetsinou sitovy spojeni).

    A to je teprve zacatek.
    Pak je potreba vyresit konkurencni pristup kdy data ktery chces updatnout, tak pred tebou updatnul nekdo jinej - musis se rozhodnout co z toho je dobre. Bud to spravne mergnout (to jde malokdy) a nebo zrusit co jsi udelal. No jo ... ale rollbacky dneska umi temer vylucne jen databaze, software transaction memory podporuje jen malo prostredi (a .NET mezi ne nepatri).

    Zrovna delame na jedny vicevlaknovy aplikaci, a fakt to neni uplne tak easy, aby jsi zajistil vysokou spolehlivost a konzistenci dat.
    ANDY_WARHOL
    ANDY_WARHOL --- ---
    TENCOKACISTROMY: co na tom má byt tak sloziteho,? aby si se to za par hodin nenaucil?
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    P19: Nechci sejckovat, ale naucit se spravne praci s multithreadingem neni na par hodin bohuzel :(.

    Chces-li to mit "hloupe" thread-safe, tak muzes udelat:
    public void Enqueue(object obj) {
        lock(_locker) {
            _queue.Enqueue(obj);
        }
    } 
    
    public object Dequeue() {
        lock(_locker) {
            return _queue.Dequeue();
        }
    } 
    ANDY_WARHOL
    ANDY_WARHOL --- ---
    NECROMAN: ME stejně přijde jako hovadina ptát se na takový detaily, který najdeš za par minut. důležitý je přece hlavně schopnost algoritmizace a objektoveho přístupu.
    Kliknutím sem můžete změnit nastavení reklam