CLR via C# .NET 4.5
От: SanyaVB  
Дата: 22.10.13 12:06
Оценка:
В четвертом издании книги Джеффери Рихтера CLR via C# увидел интересный код(возможно он был описан и предшествующих изданиях)

    class AnotherHybridLock : IDisposable
    {
        private Int32 m_waiters = 0;
        private AutoResetEvent m_waiterLock = new AutoResetEvent(false);
        private Int32 m_spincount = 4000;
        private Int32 m_owningThreadId = 0, m_recursion = 0;

        public void Enter()
        {
            Int32 threadId = Thread.CurrentThread.ManagedThreadId;
            if (threadId == m_owningThreadId) { m_recursion++; return; }

            SpinWait spinwait = new SpinWait();

            for (Int32 spinCount = 0; spinCount < m_spincount; spinCount++)
            {
                if (Interlocked.CompareExchange(ref m_waiters, 1, 0) == 0) goto GotLock;
                spinwait.SpinOnce();
            }

            if (Interlocked.Increment(ref m_waiters) > 1) m_waiterLock.WaitOne();

            GotLock:
            m_owningThreadId = threadId; m_recursion = 1;
        }

        public void Leave()
        {
            Int32 threadId = Thread.CurrentThread.ManagedThreadId;
            if (threadId != m_owningThreadId) throw new SynchronizationLockException("Lock not owned by calling thread");
            if (--m_recursion > 0) return;
            m_owningThreadId = 0;
            if (Interlocked.Decrement(ref m_waiters) == 0) return;
            m_waiterLock.Set();
        }

        public void Dispose()
        {
            m_waiterLock.Dispose();
        }
    }


За goto руки отрывают, но Рихтер все-таки авторитет. Придется оставить жить
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.