I need a simple data structure with these requirements:
- he should behave like a line
- all enqueue operations must be atomic.
I have very limited multithreading experience, but this is where I came to:
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!"); } }
First question: is this code ok?
Secod question: how can I unit test this class (for example, with two threads that periodically perform a decompression operation in a queue with elements (1, 2, 3, 4, 5, 6), and the first thread should get only odd numbers, and second stream - only even numbers)? I tried this, but the statements fail:
[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(); }
source share