Mam http server a teraz si k nemu robim SessionManager. SessionManager bude mat viac typov storov podla toho kam chcem Sessions ukladat (MemorySessionStore, FileSessionStore, DatabaseSessionStore) no a teraz riesim MemorySessionStore.
Ku storu moze pristupovat viac vlakien takze by mal byt thread safe. S lockovanim nemam ziadne skusenosti, neviem aky velky kus kodu mam zamknut. Ked som robil nieco multithreadove, bud som to riesil funkcionalne, alebo cez actor model. Viete mi poradit kde vsade a co mam lockovat? Z toho co som videl cudzie kody tak sa lockuje vsade kde sa meni nejaka hodnota a mohli by tam pristupovat viacere vlakna naraz a nastat kolizie. Alebo mi staci pouzit ConcurrentDictionary (platforma .NET) a nemusim nic lockovat?
thread-safe kolekcie
Takhle to rozhodně funkční nenapíšete. Budete potřebovat nastudovat si programování ve vícevláknovém prostředí – to zdaleka není jenom otázka ,,jak velké části kódu zamykat". Navíc konkurenční přístup se dost těžko testuje – při běžných testech na chyby nepřijdete, protože k chybám dochází náhodně. Můžete otestovat některé konkrétní případy souběhu, ale to musíte předem vědět, kde problém může nastat – jenže napsat takový test je složitější, než napsat správně ten samotný konkurenční kód, a navíc tím otestujete jenom pár vybraných případů.
Co vám zaručuje ConcurrentDictionary byste se měl dozvědět v dokumentaci. Vám ale asi nebude stačit, abyste měl konkurenčně bezpečný slovník – když si dvě různá vlákna vytáhnou ze slovníku bezpečně tu stejnou session, je to sice dobré, ale ta vlákna s tou session pak dál musí vícevláknově bezpečně pracovat.
Zamyká se vždy co nejmenší část kódu, kterou je nutné zamknout, a zamyká se tím nejméně agresivním způsobem – tj. pokud třeba ze slovníku může číst více vláken najednou, a pouze zápis musí mít exkluzivní přístup (nesmí číst ani zapisovat nikdo jiný), zamykají se čtecí části nevýlučným zámkem pro čtení a pouze zapisující části se zamykají výlučným zámkem pro zápis. Zároveň při zamykání musíte dávat pozor na uvolňování zámků (aby se uvolnily i v případě selhání operací prováděných pod zámkem). Zkrátka je toho potřeba znát mnohem víc, než jenom ,,jak velký kus kódu zamknout".
Vždycky, když jsem řešil nějaký klasický synchronizační problém, kouknul jsem do Little book of semaphores ( http://greenteapress.com/wp/semaphores/ ), je to tam pěkně popsané. Dnes už se taky snažím jet spíš funkcionálně a s mutexem nebo semaforem se moc nepotkám :)