zoukankan      html  css  js  c++  java
  • 轻量级 Lock Free 线程安全的 Queue<T> 的C#2.0实现

    最近在维护一些C# 2.0的代码....发现各种线程不安全的实现

    2.0里面又没有ConcurrentCollection的相关类

    不得已,自己写了一个,

    本来想用传统的lock实现的, 不过考虑到其中的操作非常轻量级...最终还是用了Lock Free

    使用原子操作 InterLocked 替换掉常用的lock关键字

        public sealed class SafedQueue<T>
    {
    #region private Fields
    private int isTaked = 0;
    private Queue<T> queue = new Queue<T>();
    private int MaxCount = 1000 * 1000;
    #endregion

    public void Enqueue(T t)
    {
    try
    {
    while (Interlocked.Exchange(ref isTaked, 1) != 0)
    {
    }
    this.queue.Enqueue(t);
    }
    finally
    {
    Thread.VolatileWrite(ref isTaked, 0);
    }
    }

    public T Dequeue()
    {
    try
    {
    while (Interlocked.Exchange(ref isTaked, 1) != 0)
    {
    }
    T t = this.queue.Dequeue();
    return t;
    }
    finally
    {
    Thread.VolatileWrite(ref isTaked, 0);
    }
    }

    public bool TryEnqueue(T t)
    {
    try
    {
    for (int i = 0; i < MaxCount; i++)
    {
    if (Interlocked.Exchange(ref isTaked, 1) == 0)
    {
    this.queue.Enqueue(t);
    return true;
    }
    }
    return false;
    }
    finally
    {
    Thread.VolatileWrite(ref isTaked, 0);
    }
    }

    public bool TryDequeue(out T t)
    {
    try
    {
    for (int i = 0; i < MaxCount; i++)
    {
    if (Interlocked.Exchange(ref isTaked, 1) == 0)
    {
    t = this.queue.Dequeue();
    return true;
    }
    }
    t = default(T);
    return false;
    }
    finally
    {
    Thread.VolatileWrite(ref isTaked, 0);
    }
    }
    }

    Try起头的方法都有尝试次数限制,超过限制以后就退出并返回false

  • 相关阅读:
    项目工程化之git提交规范以及 CHANGELOG生成
    移动端 弹窗-内容可滚动,背景不动
    项目readme文件目录生成工具 treer
    css animation动画
    【网络】从套接字到Web服务器
    【网络】图解HTTP-1
    【MySQL】搞懂ACID原则和事务隔离级别
    【MySQL】备份与恢复
    【MySQL】索引
    【Redis】主从复制原理
  • 原文地址:https://www.cnblogs.com/PurpleTide/p/2404608.html
Copyright © 2011-2022 走看看