• ú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
    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.
    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.
    PISKVOR
    PISKVOR --- ---
    NECROMAN: Load testing snadno a rychle :D Bohuzel to jejich e-shop ponekud nedava.
    NECROMAN
    NECROMAN --- ---
    ANDY_WARHOL: jo, na tohle jsem si take vzpomnel. Problem je, ze to je az v .NET 4.0+. Na pohovoru se te treba mohou zeptat, jak bys neco takoveho imlementoval. Na to se da pripravit tak, ze si stahnes zdrojaky te Concurrent kolekce :)
    NECROMAN
    NECROMAN --- ---
    MAIMONIDES: tak muze psat weby v ASP.NET nebo MVC 4 a C# :)
    ALIK
    ALIK --- ---
    P19: Obecně, při vícevláknových věcech potřebuješ zajistit, že:
    1. Pokud si vezmeš lock, tak ho vždy uvolníš (a to co nejrychleji). V tvém kódu je to porušeno u Dequeue nad prázdnou frontou. Formálně je ale vhodné to podobně vyřešit i u Enqueue (nikdy nevíš, co ti strčí za frontu).
    2. Nikdo nečeká, až se něco stane, zatímco má lock - například pokud je fronta prázdná a ten, kdo z ní čte, čeká na příchod nové věci, zatímco má lock, tak těžko něco dostane, neboť ten, kdo do ní má něco přidat, (marně) čeká, až se lock uvolní. Porušeno to můžeš mít potenciálně tím, že Enqueue se zasekne, pokud je fronta plná.
    3. Nikdo nepřistupuje k objektu bez locku a vše, co potřebuje, udělá v jedné transakci (tj. s jediným lockem). V tomto smyslu ten kód vyhovuje.
    MAIMONIDES
    MAIMONIDES --- ---
    P19: Jako webař můžeš buď zametat ulice nebo psát weby. C# těžko.
    NECROMAN
    NECROMAN --- ---
    dneska maji u JetBrains slevu 75% na vsechno, kdyz je ten konec sveta :)
    ReSharper:: The Most Intelligent Extension for Visual Studio - C#, VB.NET, LINQ, ASP.NET, ASP.NET MVC, XAML, XML, JavaScript, HTML build scripts. Best-of-breed tools for code refactoring, code quality analysis, code cleanup, navigation, code generation, unit testing, and code templates.
    http://www.jetbrains.com/resharper/
    ANDY_WARHOL
    ANDY_WARHOL --- ---
    P19: to by me zajimalo, na co se musis takhle ucit nemyslny detaily, tohle bych vyresil za par minut s pomoci google (a to sem to v zivote nevidel), prijde mi nesmysl, ze nekdo pozaduje na pohovoru neco takovyho.
    nicmene na tvoji otazku. ja sem nasel na googlu tohle
    System.Collections.Concurrent Namespace ()
    http://msdn.microsoft.com/en-us/library/system.collections.concurrent.aspx
    jsou to implementace primo v netu pro thread safe kolekce (mezi nimi je i quene.
    ale protoze jsem to nikdy nepotreboval nevim, zda je to best praktices.
    Kliknutím sem můžete změnit nastavení reklam