• C# LockFreeStack类


    单链表实现的LockFreeStack

    using System;
    using System.Collections;
    using System.Threading;

    namespace Rocky.Stored
    {
    public class LockFreeStack : IEnumerable
    {
    private class SingleLinkedNode
    {
    public object Value;
    public SingleLinkedNode Next;
    }

    private SingleLinkedNode m_head;
    private int count;

    public int Count
    {
    get { return count; }
    }

    public void Push(object item)
    {
    SingleLinkedNode node
    = new SingleLinkedNode();
    node.Value
    = item;
    SingleLinkedNode head;
    do
    {
    head
    = m_head;
    node.Next
    = head;
    }
    while (m_head != head || Interlocked.CompareExchange(ref m_head, node, head) != head);
    Interlocked.Increment(
    ref count);
    }

    public object Peek()
    {
    SingleLinkedNode head
    = m_head;
    if (head == null)
    {
    throw new InvalidOperationException("Stack Empty!");
    }
    return head.Value;
    }

    public object Pop()
    {
    object result;
    if (TryPop(out result))
    {
    return result;
    }
    throw new InvalidOperationException("Stack Empty!");
    }

    /// <summary>
    /// 考虑到在多线程环境中,这里不抛出异常。我们需要人为判断其是否为空,即 !TryPop() or result != null
    /// </summary>
    /// <returns></returns>
    public bool TryPop(out object item)
    {
    SingleLinkedNode head;
    SingleLinkedNode next;
    do
    {
    head
    = m_head;
    if (head == null)
    {
    item
    = null;
    return false;
    }
    next
    = m_head.Next;
    }
    while (Interlocked.CompareExchange(ref m_head, next, head) != head);
    Interlocked.Decrement(
    ref count);
    item
    = head.Value;
    return true;
    }

    public object SpinPop()
    {
    SingleLinkedNode head;
    SpinWait spin
    = new SpinWait();
    while (true)
    {
    SingleLinkedNode next;
    do
    {
    head
    = m_head;
    if (head == null)
    {
    goto emptySpin;
    }
    next
    = head.Next;
    }
    while (m_head != head || Interlocked.CompareExchange(ref m_head, next, head) != head);
    break;
    emptySpin:
    spin.Spin();
    }
    Interlocked.Decrement(
    ref count);
    return head.Value;
    }

    public bool Contains(object item)
    {
    SingleLinkedNode head
    = m_head;
    while (m_head != null && head != null)
    {
    if (head.Value.Equals(item))
    {
    return true;
    }
    head
    = head.Next;
    }
    return false;
    }

    public void Clear()
    {
    Interlocked.Exchange(
    ref m_head, null);
    Interlocked.Exchange(
    ref count, 0);
    }

    public IEnumerator GetEnumerator()
    {
    SingleLinkedNode head
    = m_head;
    while (m_head != null && head != null)
    {
    yield return head.Value;
    head
    = head.Next;
    }
    }
    }
    }
  • 相关阅读:
    SSM-Spring-02:Spring的DI初步加俩个实例
    python自动华 (五)
    python自动华 (三)
    python自动华 (四)
    python自动华 (二)
    python自动华 (一)
    java 下拉控件 转自 http://www.cnblogs.com/lhb25/p/form-enhanced-with-javascript-three.html
    java 正则《转载》
    jQuery 操作一览表
    JAVA多线程和并发基础面试问答
  • 原文地址:https://www.cnblogs.com/Googler/p/1754501.html
Copyright © 2020-2023  润新知