示例#1
0
 private int setSize;             //количество элементов в таблице, чтобы решить, надо ли менять размер
 public LockFreeHashSet(int capacity)
 {
     bucket     = new BucketList <T> [capacity]; // пустой список бакетов размером капасити
     bucket[0]  = new BucketList <T>();          //первый элемент - пустой список элементов
     bucketSize = 2;                             //емкость бакета 2 (0 и 1 потому что 2i)
     setSize    = 0;                             //количество элементов в таблице
 }
示例#2
0
 public LockFreeHashSet(int capacity)
 {
     bucket     = new BucketList <T> [capacity];
     bucket[0]  = new BucketList <T>();
     bucketSize = 2;
     setSize    = 0;
 }
示例#3
0
        private void InitializeBucket(int myBucket)
        {
            int parent = GetParent(myBucket); //получаем родителя бакета

            if (bucket[parent] == null)       //если родителя нет, то
            {
                InitializeBucket(parent);     //инициализируем его
            }
            BucketList <T> b = bucket[parent].GetSentinel(myBucket);

            if (b != null)
            {
                bucket[myBucket] = b;
            }
        }
示例#4
0
        private void InitializeBucket(int myBucket)
        {
            int parent = GetParent(myBucket);

            if (bucket[parent] == null)
            {
                InitializeBucket(parent);
            }
            BucketList <T> b = bucket[parent].GetSentinel(myBucket);

            if (b != null)
            {
                bucket[myBucket] = b;
            }
        }
示例#5
0
        public bool Add(T x)
        {
            int            myBucket = x.GetHashCode() % bucketSize; // получается бакет в который надо добавить
            BucketList <T> b        = GetBucketList(myBucket);      // инициализируем при необходимости

            if (!b.Add(x))
            {
                return(false);
            }
            int setSizeNow    = Interlocked.Increment(ref setSize);
            int bucketSizeNow = bucketSize;

            if (setSizeNow / bucketSizeNow > THRESHOLD)
            {
                Interlocked.CompareExchange(ref bucketSize, bucketSizeNow, 2 * bucketSizeNow);
            }
            return(true);
        }
示例#6
0
        public bool Add(T x)
        {
            int            myBucket = Math.Abs(x.GetHashCode()) % bucketSize;
            BucketList <T> b        = GetBucketList(myBucket);

            if (!b.Add(x))
            {
                return(false);
            }
            int setSizeNow    = Interlocked.Increment(ref setSize);
            int bucketSizeNow = bucketSize;

            if (setSizeNow / bucketSizeNow > THRESHOLD)
            {
                Interlocked.CompareExchange(
                    ref bucketSize, bucketSizeNow, 2 * bucketSizeNow);
            }
            return(true);
        }