コード例 #1
0
 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);
 }
コード例 #5
0
ファイル: 2_LockFreeSkipList.cs プロジェクト: Roxter/Vtornik
 //конструктор обычных нод
 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; //максимальный уровень = высоте
 }
コード例 #6
0
ファイル: 2_LockFreeSkipList.cs プロジェクト: Roxter/Vtornik
 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; //максимальный уровень
 }
コード例 #7
0
ファイル: UtilsTest.cs プロジェクト: VikKol/commonsfornet
        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);
        }
コード例 #8
0
ファイル: UtilsTest.cs プロジェクト: VikKol/commonsfornet
        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]);
                    }
                }
            }
        }
コード例 #9
0
ファイル: UtilsTest.cs プロジェクト: VikKol/commonsfornet
        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);
        }
コード例 #10
0
ファイル: UtilsTest.cs プロジェクト: VikKol/commonsfornet
        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);
        }