• ú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
    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.
    P19
    P19 --- ---
    Zdravím,

    připravuju se na pohovor a našel jsem úlohu v C#:
    mám semaphor a queue (nesmím použít žádnou 3rd party library). Mám napsat thread-safe queue, ke které přistupuje několik vláken, které do fronty vkládají a ostatní vlákna z fronty vybírají. Těch co z fronty čtou je o poznání více než těch, co do ní vkládají. Rychlost je hlavní kritérium (jak jinak :D).

    Jako pravověrný webař v tom popravdě hodně plavu, napsal jsem tohle, ale nechce se mi věřit, že by to bylo ono, tak jednoduchý:

    public void Enqueue(object obj)
    {
    _semaphore.WaitOne();
    _queue.Enqueue(obj);
    _semaphore.Release();
    }

    public object Dequeue()
    {
    object obj = null;
    _semaphore.WaitOne();
    obj = _queue.Dequeue();
    _semaphore.Release();
    return obj;
    }
    Můžete mě prosím někdo nakopnout správným směrem?

    Díky moc
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    ALIK: To jo. Ale kdyz vemu ten svuj managed kod a zkopiruju ho u projektu WPF do projeku Store, tak mi to v zasade pobezi. Maximalne s nejakejma drobnejma upravama.
    ALIK
    ALIK --- ---
    TENCOKACISTROMY: Ne, WPF a WinRT má společné jen to, že podporují jazyk XAML (který lidi znají ze Silverlight a WPF, nicméně i u něj se implementace odlišují) pro definici vzhledu a .NET jako "jazyk". Vše ostatní je jiné. Zatímco WPF je implementováno jako nadstavba, WinRT je nativní Win API. Jedná se o další implementaci toho samého, na co je poslední dobou MS odborník - WPF, Silverlight, WinRT sice vypadají, že jsou si podobné, ale jedná se o zcela jinou implementaci (skoro) téhož.
    ANDY_WARHOL
    ANDY_WARHOL --- ---
    tak ja vsechny kontroly zatim kreslim primo v kodu pomoci drawing context, xaml je pouzit akorat pri nanaseni kontrolu na plochu, ale tam bude casem designer a taky se to bude delat v kodu.
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    TENCOKACISTROMY: Tak jsem to aspon pochopil.
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    ALIK: Prave proto mas pouzit WPF - to je "nativni" zpusob jak tam delat UI.
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    ALIK: Jestli se pro nej rozhodnes (ostatne proc ne, kdyz ti bude stacit), tak nam tu dej vedet jaka s tim byla zkusenost.
    Kliknutím sem můžete změnit nastavení reklam