続き public T Dequeue() { int current; int next; do { Thread.MemoryBarrier(); current = m_tail; if (current == m_head) return null; next = NextIndex(current); } while (Interlocked.CompareExchange(ref m_tail, next, current) != current); T value; while ((value = m_buffer[current]) == null) Wait(); m_buffer[current] = null; Thread.MemoryBarrier(); return value; }