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