/// <summary>
        /// Returns the next element from the queue without removing it
        /// </summary>
        /// <returns>A pointer to the next element from the queue</returns>
        /// <exception cref="InvalidOperationException">If the queue is empty</exception>
        public T *Peek()
        {
            AtomicNode *root    = AcquireRoot();
            bool        empty   = (root->Next == 0);
            var         payload = (T *)(empty ? 0 : ((AtomicNode *)root->Next)->Payload);

            ReleaseRoot(root);
            if (empty)
            {
                throw new InvalidOperationException("Queue is empty");
            }
            return(payload);
        }
        /// <summary>
        /// Add an element to the queue
        /// </summary>
        /// <param name="payload">A pointer to the element to be added</param>
        public void Enqueue(T *payload)
        {
            var         node = (long)Acquire((long)payload, 0);
            AtomicNode *root = AcquireRoot();
            var         last = (AtomicNode *)root->Payload;

            root->Payload = node;
            if (last != null)
            {
                last->Next = node;
            }
            if (root->Next == 0)
            {
                // Queue was empty
                root->Next = node;
            }
            ReleaseRoot(root);
        }