Ejemplo n.º 1
0
        public void Leave()
        {
            bool alreadyDecremented = false;

            //nao há ninguem em espera
            if (waitingCount == 0)
            {
                // reitro
                Interlocked.Decrement(ref insideCount);
                //ainda nao há ninguem À espera, retorno
                if (waitingCount == 0)
                {
                    return;
                }
                alreadyDecremented = true;
            }
            lock (myLock)
            {
                // nao existe thread em espera
                LinkedListNode <bool> first = waitingQueue.First;
                if (first == null)
                {
                    insideCount--;
                    return;
                }
                // nao é possivel adquirir, retorno
                if (alreadyDecremented && !TryAcquire())
                {
                    return;
                }
                first.Value   = true;
                waitingCount -= 1;
                waitingQueue.Remove(first);
                SyncUtils.Notify(myLock, first);
            }
        }