// 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); }
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); //иначе возвращаем, что не смогли украсть }