Exemplo n.º 1
0
        protected override void Acquire(T x)
        {
            bool   mark = true;                 //метка изменения размера
            Thread me   = Thread.CurrentThread; //инициализация себя
            Thread who;

            while (true) //бесконечный цикл
            {
                do
                {
                    who = _owner.Get(out mark);                                 //получаем владельца и складываем его метку
                } while (mark && who != me);                                    //пока изменяется размер и я не владелец
                Mutex[] oldLocks = _locks;                                      //запоминаем старые блокировки
                Mutex   oldLock  = oldLocks[x.GetHashCode() % oldLocks.Length]; //запоминаем старую блокировку, которую хотели взять
                oldLock.WaitOne();                                              //блокируем ее
                who = _owner.Get(out mark);                                     //получаем владельца изменения размера
                if ((!mark || who == me) && _locks == oldLocks)                 //если не меняется размер или я владелец и никто не менял блокировки
                {
                    return;                                                     //получаем нужную блокировку
                }
                else
                {
                    oldLock.ReleaseMutex(); //отпускаем нужную блокировку
                }
            }
        }
        protected override void Acquire(T x)
        {
            bool   mark = true;
            Thread me   = Thread.CurrentThread;
            Thread who;

            while (true)
            {
                do
                {
                    who = _owner.Get(out mark);
                } while (mark && who != me);
                Mutex[] oldLocks = _locks;
                Mutex   oldLock  = oldLocks[Math.Abs(x.GetHashCode() % oldLocks.Length)];
                oldLock.WaitOne();
                who = _owner.Get(out mark);
                if ((!mark || who == me) && _locks == oldLocks)
                {
                    return;
                }
                else
                {
                    oldLock.ReleaseMutex();
                }
            }
        }