Я создал класс «Менеджер», который содержит ограниченный набор ресурсов. Ресурсы хранятся в «Менеджере» как очередь. Я инициализирую Queue и Semaphore одинаковым размером, используя семафор, чтобы заблокировать поток, если ресурсов нет. У меня есть несколько потоков, вызывающих этот класс для запроса ресурса. Вот код псевдео:Состояние семафорской гонки?
public IResource RequestResource()
{
IResource resource = null;
_semaphore.WaitOne();
lock (_syncLock)
{
resource = _resources.Dequeue();
}
return resource;
}
public void ReleaseResource(IResource resource)
{
lock (_syncLock)
{
_resources.Enqueue(resource);
}
_semaphore.Release();
}
При запуске этого приложения кажется, что он работает нормально. Тогда, похоже, моя очередь выделяет один и тот же объект. Кажется ли это возможным? Я вытягиваю свои волосы здесь, и любая помощь будет очень признательна. Не стесняйтесь запрашивать дополнительную информацию, если вам это нужно. Благодаря!
Можете вы переформатировать и дать нам код, который вызывает это? –
да, извините, я вставлял в вкладки и думал, что это выглядит правильно в первоначальном предварительном просмотре, исправлено сейчас. – poindexter12
Изменяется ли размер очереди, когда это происходит? Является ли объект одинаковым даже для разных потоков? Каковы шаблоны вызова? Были ли в Enqueue и Dequeue какие-то исключения (у вас там есть ошибки)? Вы пытались отладить его? – 2010-04-21 04:18:13