Thread Safety a Lockovanie

BFU

Thread Safety a Lockovanie
« kdy: 27. 06. 2016, 17:47:57 »
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?



perceptron

Re:Thread Safety a Lockovanie
« Odpověď #1 kdy: 27. 06. 2016, 19:02:04 »
thread-safe kolekcie

Re:Thread Safety a Lockovanie
« Odpověď #2 kdy: 27. 06. 2016, 19:13:48 »
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“.

ava

Re:Thread Safety a Lockovanie
« Odpověď #3 kdy: 28. 06. 2016, 21:31:34 »
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 :)