public IEnumerator <T> GetEnumerator() { FreeNode <T> node = _root; while (node != null) { yield return(node.Value); node = node.Next; } }
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; } }
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) } }
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); }