Пример #1
0
        public T Get()
        {
            for (int i = Thread.VolatileRead(ref poolIndex); i >= 0; i--)
            {
                T value = pools[i].GetIfSpaceAvailable();
                if (value != default(T))
                {
                    value.Index |= i << 24;
                    return(value);
                }
            }

            lock (sync)
            {
                for (; ;)
                {
                    int index = Thread.VolatileRead(ref poolIndex);

                    T value = pools[index].GetIfSpaceAvailable();
                    if (value != default(T))
                    {
                        value.Index |= index << 24;
                        return(value);
                    }

                    int newIndex = Thread.VolatileRead(ref poolIndex) + 1;
                    pools[newIndex] = new LockFreeFastPool <T>(minSize << newIndex);
                    Thread.VolatileWrite(ref poolIndex, newIndex);
                }
            }
        }
Пример #2
0
 public FastResizablePool()
 {
     poolIndex = 0;
     sync      = new object();
     pools     = new LockFreeFastPool <T> [maxPoolsQty];
     pools[0]  = new LockFreeFastPool <T>(minSize);
 }