/** * @throw InvalidOperationException if empty */ public virtual object Dequeue() { object result = _queue.Dequeue(); Interlocked.Decrement(ref _count); return(result); }
public void SimpleQueueTest() { LockFreeQueue <object> lfqo = new LockFreeQueue <object>(); LockFreeQueue <int> lfqi = new LockFreeQueue <int>(); Queue q = new Queue(); Random r = _rand; //Put in a bunch of random numbers: int max = r.Next(2048, 4096); for (int i = 0; i < max; i++) { int k = r.Next(); lfqo.Enqueue(k); lfqi.Enqueue(k); q.Enqueue(k); } //Now verify that everything is okay: bool success; int kq; int klfo; int klfi; for (int i = 0; i < max; i++) { klfo = (int)lfqo.TryDequeue(out success); Assert.IsTrue(success, "Dequeue<o> success"); klfi = lfqi.TryDequeue(out success); Assert.IsTrue(success, "Dequeue<i> success"); kq = (int)q.Dequeue(); Assert.AreEqual(kq, klfo, "LockFreeQueue<object> == Queue"); Assert.AreEqual(kq, klfi, "LockFreeQueue<int> == Queue"); } try { lfqi.Dequeue(); Assert.IsTrue(false, "LockFreeQueue<int> post-Dequeue exception"); } catch (InvalidOperationException) { Assert.IsTrue(true, "LockFreeQueue<int> exception"); } try { lfqo.Dequeue(); Assert.IsTrue(false, "LockFreeQueue<object> post-Dequeue exception"); } catch (InvalidOperationException) { Assert.IsTrue(true, "LockFreeQueue<int> exception"); } }