private void InitNext() { for (var i = 0; i < Next.Length; i++) { Next[i] = new AtomicMarkableReference <SkipListNode>(null, false); } }
// constructor for sentinel nodes public Node(int key) { Value = default(T); this.Key = key; Next = new AtomicMarkableReference <Node <T> > [MAX_LEVEL + 1]; for (int i = 0; i < Next.Length; i++) { Next[i] = new AtomicMarkableReference <Node <T> >(null, false); } TopLevel = MAX_LEVEL; }
// constructor for ordinary nodes public Node(T x, int height) { Value = x; Key = x.GetHashCode(); Next = new AtomicMarkableReference <Node <T> > [height + 1]; for (int i = 0; i < Next.Length; i++) { Next[i] = new AtomicMarkableReference <Node <T> >(null, false); } TopLevel = height; }
public RefinableCuckooHashSet(int capacity) : base(capacity) { locks = new Mutex[2, capacity]; for (int i = 0; i < 2; i++) { for (int j = 0; j < capacity; j++) { locks[i, j] = new Mutex(); } } owner = new AtomicMarkableReference <Thread>(null, false); }
//конструктор обычных нод public Node(T x, int height) { Value = x; //сохраняем значение Key = x.GetHashCode(); //ключ - хэш значения Next = new AtomicMarkableReference <Node <T> > [height + 1]; //инициализируем массив ссылток для следующих for (int i = 0; i < Next.Length; i++) { //для всего столбика следующих инициализируем ссылки налл Next[i] = new AtomicMarkableReference <Node <T> >(null, false); } TopLevel = height; //максимальный уровень = высоте }
public int TopLevel; //верхний уровень //конструктор сентинелов public Node(int key) { Value = default(T); //дефолтное this.Key = key; //сохраняем ключ Next = new AtomicMarkableReference <Node <T> > [MAX_LEVEL + 1]; //инициализируем столбик следующих for (int i = 0; i < Next.Length; i++) { //для всего столбика следующих инициализируем ссылки налл Next[i] = new AtomicMarkableReference <Node <T> >(null, false); } TopLevel = MAX_LEVEL; //максимальный уровень }
public void TestAmrTryGetValue() { var order = new Order { Id = 1, Name = "1" }; var amr = new AtomicMarkableReference <Order>(order, false); bool isMarked = true; var theOrder = amr.TryGetValue(out isMarked); Assert.False(isMarked); Assert.Same(order, theOrder); }
public void TestParallelAmr() { var random = new Random((int)DateTime.Now.Ticks & 0x0000ffff); for (var j = 0; j < 50; j++) { var orders = new HashedMap <Order, bool>(10, new OrderEqualityComparer()); var orderRef = new Order { Id = -1, Name = "-1" }; var markedOrder = new AtomicMarkableReference <Order>(orderRef, false); for (var i = 0; i < 10; i++) { var order = new Order { Id = i, Name = i.ToString() }; var marked = (random.Next() % 2) == 1; orders.Add(order, marked); } var results = new bool[10]; Parallel.ForEach(orders, x => { var rand = 0; lock (locker) { rand = random.Next() % 20; } Thread.Sleep(rand); var result = markedOrder.CompareExchange(orderRef, false, x.Key, x.Value); lock (locker) { results[x.Key.Id] = result; } }); Assert.Equal(orders[markedOrder.Value], markedOrder.IsMarked); for (var i = 0; i < 10; i++) { if (i != markedOrder.Value.Id) { Assert.False(results[i]); } else { Assert.True(results[i]); } } } }
public void TestAmrExchangeWithSameMark() { var order = new Order { Id = 1, Name = "1" }; var amr = new AtomicMarkableReference <Order>(order, false); var newOrder = new Order { Id = 2, Name = "2" }; Assert.True(amr.Exchange(newOrder, false)); Assert.Same(newOrder, amr.Value); Assert.False(amr.IsMarked); }
public void TestAmrCasWithSameMark() { var order = new Order { Id = 1, Name = "1" }; var amr = new AtomicMarkableReference <Order>(order); Assert.Same(order, amr.Value); Assert.Equal(1, amr.Value.Id); Assert.Equal("1", amr.Value.Name); Assert.False(amr.IsMarked); var newOrder = new Order { Id = 2, Name = "2" }; Assert.True(amr.CompareExchange(order, false, newOrder, false)); Assert.Same(newOrder, amr.Value); Assert.Equal(2, amr.Value.Id); Assert.Equal("2", amr.Value.Name); }