/// <summary>
    /// Removes an item from the buffer.
    /// </summary>
    /// <returns>The next available item</returns>
    public T Dequeue()
    {
        var next = _consumerCursor.ReadAcquireFence() + 1;

        while (_producerCursor.ReadAcquireFence() < next) // makes sure we read the data from _entries after we have read the producer cursor
        {
            Thread.SpinWait(1);
        }
        var result = this[next];

        _consumerCursor.WriteReleaseFence(next); // makes sure we read the data from _entries before we update the consumer cursor
        return(result);
    }
Exemple #2
0
 public void ReadAcquireFenceReturnsInitialValue()
 {
     Assert.AreEqual(InitialValue, _volatile.ReadAcquireFence());
 }