我需要一个简单的数据结构,它需要满足以下要求:
- 它应该像队列一样运作,
- 所有入队操作都应该是原子性的。
我对多线程有非常有限的经验,但这就是我想到的:
public class Tickets
{
private ConcurrentQueue<uint> _tickets;
public Tickets(uint from, uint to)
{
Initialize(from, to);
}
private readonly object _lock = new object();
public void Initialize(uint from, uint to)
{
lock(_lock)
{
_tickets = new ConcurrentQueue<uint>();
for (uint i = from; i <= to; i++)
{
_tickets.Enqueue(i);
}
}
}
public uint Dequeue()
{
uint number;
if (_tickets.TryDequeue(out number))
{
return number;
}
throw new ArgumentException("Ticket queue empty!");
}
}
第一个问题:这段代码可行吗?
第二个问题:如何对此类进行单元测试(例如,使用两个线程定期在具有元素(1、2、3、4、5、6)的队列上执行出队操作,第一个线程应仅获取奇数,第二个线程应仅获取偶数)?我尝试过这样做,但断言没有执行:
[Test]
public void Test()
{
var tickets = new Tickets(1, 4);
var t1 = new Thread(() =>
{
Assert.AreEqual(1, tickets.Dequeue());
Thread.Sleep(100);
Assert.AreEqual(3, tickets.Dequeue());
});
var t2 = new Thread(() =>
{
Assert.AreEqual(2, tickets.Dequeue());
Thread.Sleep(100);
Assert.AreEqual(4, tickets.Dequeue());
});
t1.Start();
t2.Start();
}
Dequeue
。 - Ahmed KRAIEM