Exemplo n.º 1
0
        public IEnumerator <T> GetEnumerator()
        {
            FreeNode <T> node = _root;

            while (node != null)
            {
                yield return(node.Value);

                node = node.Next;
            }
        }
Exemplo n.º 2
0
        public void Push(T value)
        {
            var          node          = new FreeNode <T>(value);
            FreeNode <T> oldRootResult =
                Interlocked.CompareExchange(ref _root, node, null);

            if (oldRootResult != null)
            {
                oldRootResult.Next = node;
            }
        }
Exemplo n.º 3
0
        public void Push(T value)
        {
            var          node          = new FreeNode <T>(value);
            FreeNode <T> oldRootResult =
                Interlocked.CompareExchange(ref _root, node, null);

            if (oldRootResult != null)     // _root was assigned by other thread
            {
                oldRootResult.Next = node; // thread-safe (lock-free)
            }
        }
Exemplo n.º 4
0
        public FreeNode <T> Pop()
        {
            FreeNode <T> oldRootResult = null;
            FreeNode <T> oldRoot;

            do
            {
                oldRoot = _root;
                if (oldRoot == null)
                {
                    break;
                }
                oldRootResult = Interlocked.CompareExchange(ref _root, oldRoot.Next, oldRoot);
            } while (oldRootResult != oldRoot);

            return(oldRootResult);
        }