我需要创建一个通用队列,可以将我的多个生产者排队,并由多个消费者排队。
我希望系统至少尝试两次,以防它在更改系统期间尝试操作,因此如果进程线程失败,则现在标记的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;
}
}
}
答案 0 :(得分:0)
ConcurrentQueue是一个线程安全的实现,可以完全满足您的需求。你自己的代码肯定会更快。使用此link查看ConcurrentQueue实现的源代码。