public Task PopTop()
        {
            int oldTop    = top;
            int newTop    = oldTop + 1;
            int oldBottom = bottom;
            int size      = oldBottom - oldTop;

            if (size <= 0)
            {
                return(null);
            }
            Task t = tasks.Get(oldTop);

            if (Interlocked.CompareExchange(ref top, oldTop, newTop) == oldTop)
            {
                return(t);
            }
            return(null);
        }
コード例 #2
0
ファイル: 2_UnboundDEQueue.cs プロジェクト: Roxter/Vtornik
        public Task PopTop()
        {
            int oldTop    = top;                //запоминаем верхний индекс
            int newTop    = oldTop + 1;         //запоминаем новый верхний индекс
            int oldBottom = bottom;             //запоминаем нижний индекс
            int size      = oldBottom - oldTop; //вычисляем разницу между нижним и верхним индексом

            if (size <= 0)
            {
                return(null);                                                   //если нижний меньше либо равен верхнему, тогда размер <= 0, задач нет
            }
            Task t = tasks.Get(oldTop);                                         //берем задачу по верхнему индексу

            if (Interlocked.CompareExchange(ref top, oldTop, newTop) == oldTop) // если удалось заменить страую верхнюю границу на новую
            {
                return(t);                                                      //урали элемент
            }
            return(null);                                                       //иначе нет
        }