title: Reentry in Semaphore
body: <p>Is there some similar implementation of <code>Semaphore</code> or <code>SemaphoreSlim</code> that allows reentry? 
  What is the best way to implement this feature, it is safe use  <code>Thread.CurrentThread.ManagedThreadId</code> and <code>ConcurrentDictionary</code> or maybe a field with <code>[ThreadStatic]</code> attribute?</p>