C#</t>中的线程安全队列<t>

时间:2015-03-02 21:13:06

标签: c# .net multithreading queue

我需要创建一个通用队列,可以将我的多个生产者排队,并由多个消费者排队。

我希望系统至少尝试两次,以防它在更改系统期间尝试操作,因此如果进程线程失败,则现在标记的qBit再次排队,然后再次处理时,执行该操作的线程将知道另一个线程已经尝试过一次此操作,如果失败,请将此特定的一个线程运送到补救队列进行外部干预。

所以....对于实际的问题,我意识到队列的状态可能在contains()和队列操作之间发生变化,就像套接字检查只是一种错误控制,而不是替换。我这样做是因为当两个相同的id(由GUID标识)尝试并排队qBit的不同对象实例时,两个生产者线程可能会抛出错误。

问题是,这是一个合理的实施吗?我无法看到它永远陷入僵局,因为无论处理qBit的结果如何,所有方法都会返回,这使我可以在某种程度上阻止其中的一些......

思考和第二组眼睛好吗?

public class tsQueue<t>
{
    object syncLock = new object();
    private Queue<qBit<t>> Q = new Queue<qBit<t>>();
    List<t> contents = new List<t>();

    public qBit<t> deQueue()
    {
        lock (syncLock)
        {
            qBit<t> pop =  Q.Dequeue();
            contents.Remove(pop.item);
            return pop;
        }
    }

    public void enQueue(qBit<t> push)
    {
        lock (syncLock)
        {
            contents.Add(push.item);
            Q.Enqueue(push);
        }
    }

    public bool contains(t check) {
        lock (syncLock)
        {
            return contents.Contains(check);
        }
    }

    public class qBit<t>
    {
        public bool flag { get; set; }
        private t _item;
        public t item { get { return _item; } }

        public qBit(t item)
        {
            this._item = item;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

ConcurrentQueue是一个线程安全的实现,可以完全满足您的需求。你自己的代码肯定会更快。使用此link查看ConcurrentQueue实现的源代码。