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; //количество элементов в таблице }
public LockFreeHashSet(int capacity) { bucket = new BucketList <T> [capacity]; bucket[0] = new BucketList <T>(); bucketSize = 2; setSize = 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; } }
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; } }
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); }
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); }