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(); } } }