C# 中的线程安全队列 <t>
Thread safe Queue <t> in C#
我需要创建一个通用队列,它可以在我的多个生产者中排队,并由多个消费者出队。
我希望系统至少尝试两次,以防它在系统更改期间尝试执行操作,因此如果进程线程失败,现在标记的 qBit 将再次排队,然后再次处理时,执行该操作的线程操作将知道另一个线程已经尝试过此操作一次,如果失败,则将此特定线程发送到补救队列以进行外部干预。
所以....对于实际问题,我意识到队列的状态可以在 contains() 和队列操作之间改变,就像套接字检查只是一种错误控制形式,而不是替代。我这样做是因为当两个相同的 id(由 GUID 标识)尝试排队时,两个生产者线程可能会抛出错误,否则将是 qBit 的不同对象实例。
问题是,这样的实现合理吗?我看不到它会陷入僵局,因为所有方法都会 return 而不管处理 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;
}
}
}
ConcurrentQueue 是一个线程安全的实现,它完全可以满足您的需求。它也肯定会比您自己的代码更快。使用此 link 查看 ConcurrentQueue 实现的源代码。
我需要创建一个通用队列,它可以在我的多个生产者中排队,并由多个消费者出队。
我希望系统至少尝试两次,以防它在系统更改期间尝试执行操作,因此如果进程线程失败,现在标记的 qBit 将再次排队,然后再次处理时,执行该操作的线程操作将知道另一个线程已经尝试过此操作一次,如果失败,则将此特定线程发送到补救队列以进行外部干预。
所以....对于实际问题,我意识到队列的状态可以在 contains() 和队列操作之间改变,就像套接字检查只是一种错误控制形式,而不是替代。我这样做是因为当两个相同的 id(由 GUID 标识)尝试排队时,两个生产者线程可能会抛出错误,否则将是 qBit 的不同对象实例。
问题是,这样的实现合理吗?我看不到它会陷入僵局,因为所有方法都会 return 而不管处理 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;
}
}
}
ConcurrentQueue 是一个线程安全的实现,它完全可以满足您的需求。它也肯定会比您自己的代码更快。使用此 link 查看 ConcurrentQueue 实现的源代码。