Re[5]: Lock-free array-based stack
От: Jolly Roger  
Дата: 01.03.10 16:18
Оценка:
Здравствуйте, remark, Вы писали:

R>Нет. Объект-то может создаться по тому же адресу, но это не будет проблемой, т.к. он может там создаться только тогда, когда ни у одного потока не осталось указателей на старый объект (соотв. он не может быть аргументом для CAS), поэтому ABA быть не может.


Да, посидев и подумав, я уже начал это подозревать — просто не смог придумать сценарий когда-бы это стало проблемой

R>Это не то, с чем следует ознакамливаться, особенно без комментариев о неработоспособности.


Ну зато Вы прокомментировали — всё равно польза

Набравшись наглости, рискну обратиться с просьбой — Вы не могли бы раскритиковать ещё один пример

    public class LockFreeStack<T> where T: class
    {
        class StackItem<T1> where T1 : class
        {
            public T1 Value;
            public volatile StackItem<T1> Next = null;
            public StackItem(T1 data) { Value = data; }
        }

        private volatile int count = 0;
        private volatile StackItem<T> Head = null;

        public int Count { get { return count; } }
 
        public T Pop()
        {
            StackItem<T> tmpHead;
            do
            {
                tmpHead = Head;
                Thread.MemoryBarrier();
                if (tmpHead == null) return null;
                if (Interlocked.CompareExchange<StackItem<T>>(
                    ref Head, tmpHead.Next, tmpHead) == tmpHead)
                {
                    Interlocked.Decrement(ref count);
                    return tmpHead.Value;
                }
            } 
            while (true);
        }

        public void Push(T data)
        {
            StackItem<T> item = new StackItem<T>(data);
            StackItem<T> tmpHead;
            do
            {
                tmpHead = Head;
                item.Next = tmpHead;
                Thread.MemoryBarrier();
                if (Interlocked.CompareExchange<StackItem<T>>(
                    ref Head, item, tmpHead) == tmpHead)
                {
                    Interlocked.Increment(ref count);
                    return;
                }
            }
            while (true);
        }
    }
"Нормальные герои всегда идут в обход!"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.