// for thief
        public Task PopTop()
        {
            int stamp = 0;
            int oldTop = top.Get(out stamp), newTop = oldTop + 1;
            int oldStamp = stamp, newStamp = oldStamp + 1;

            if (bottom <= oldTop)
            {
                return(null);
            }
            Task t = tasks[oldTop];

            if (top.CompareAndSet(oldTop, newTop, oldStamp, newStamp))
            {
                return(t);
            }
            return(null);
        }
コード例 #2
0
ファイル: 1_BoundDEQueue.cs プロジェクト: Roxter/Vtornik
        public Task PopTop()
        {
            int stamp = 0; //инициализируем штамп
            int oldTop = top.Get(out stamp), newTop = oldTop + 1;
            //запоминаем верхнюю границу , а новую верхняя = старая + 1
            int oldStamp = stamp, newStamp = oldStamp + 1;

            //запоминаем штамп и новый штамп увеличиваем старый на единицу
            if (bottom <= oldTop)   //близко к вершине или сама вершина
            {
                return(null);       //если нижняя граница меньше либо равно верхней, возвращаем налл (типа красть нечего)
            }
            Task t = tasks[oldTop]; //берет задачу из запомненой верхней границы

            if (top.CompareAndSet(oldTop, newTop, oldStamp, newStamp))
            {
                //если удалось заменить старую верхнюю границу на новую и поменять штамп изменений
                return(t); // отдаем элемент
            }
            return(null);  //иначе возвращаем, что не смогли украсть
        }