2013-03-13 2 views
1

У меня есть статический список объектов. Во время программы создается много потоков. Сразу после создания каждого потока создается новый объект и добавляется в статический список. В программе есть еще один поток, ответственный за итерирование по статическому списку.Создать Mutex с приоритетным наследованием в C#

Предположим, что поток с низким приоритетом «A» является доступом к списку, а другой поток с более высоким приоритетом «C» также запрашивает доступ к нему, май (в редком случае), этот поток со средой приоритет «B», который существует в системе, получит процессорное время «A». Итак, «C» будет ждать «B», вопреки здравому смыслу.

Как я могу получить блокировку в Список, не вовлекаясь в эту проблему инверсии приоритетов?

Функция 'Lock()' может помочь?

Спасибо!

+0

Нет, 'lock' не поможет. Также не будет класса «Mutex». Это FIFO. Насколько я помню, все объекты синхронизации Windows являются FIFO. Какую проблему вы действительно пытаетесь решить? Это необычно для объектов синхронизации, чтобы вызвать серьезную проблему инверсии приоритета. Если они это сделают, я бы предположил, что дизайн приложения не такой, каким он должен быть. –

+0

Я хочу добавить список, который будет доступен для многих процессов. –

+0

Что здесь означает «доступно»? Являются ли приоритетные потоки и потоки с низким приоритетом как добавлением, так и удалением элементов? В первую очередь, чтение, но иногда писать?Итерирование по списку и выполнение сложных операций? Не зная больше о том, как осуществляется доступ к списку, невозможно сделать какие-либо рекомендации или даже определить, является ли приоритетная инверсия потенциальной проблемой. –

ответ

2

То есть, в худшем случае, на короткий срок проблема с инверсией приоритета. Если, конечно, нить низкого приоритета A удерживает замок в течение очень долгого времени. Thread C не может добиться прогресса, потому что он ждет блокировки. Как сказал в своем ответе Ханс Пассант, планировщик потоков обнаруживает эту проблему и повышает приоритет потока с более низким приоритетом, чтобы он мог освободить блокировку. Первая ссылка MSDN, которую он опубликовал, объясняет это довольно хорошо.

Если низкий приоритет поток А удерживает блокировку в течение очень долгого времени (т.е. это делать сложные вычисления в списке), и это вызывает проблемы в вашем приложении, то вы можете сделать одно из следующих действий:

  • Увеличить приоритет нитяного
  • Have нити стопорного список, получить элемент, откройте список, а затем обрабатывать деталь
  • замок список, сделать копию, откройте список и обработать копию.
  • некоторые вариации или комбинации вышеуказанного

В любом случае, проблема не замок. Проблема заключается в кодировании программы, так что поток высоких приоритетов может быть оставлен долгое время в структуре данных, для которой нужен поток с более низким приоритетом.

+0

Большое спасибо! –

2

Приоритетная инверсия - очень общая проблема в операционной системе, которая использует приоритет потока, чтобы выбрать следующий поток для планирования. Как Windows. Планировщик потоков операционной системы имеет конкретные контрмеры против него, искусственно набрасывая приоритет потока, когда он обнаруживает проблему с инверсией, так что поток с низким приоритетом разрешен для запуска и предоставляется возможность освободить блокировку. Страница MSDN, которая описывает функцию is here. И старая статья в КБ с более подробной информацией is here.

Не помогите.

+0

Итак .. Если я это понимаю ... Если я заблокирую доступ к ресурсам с помощью функции «Заблокировать», Windows обеспечит, что проблем не будет? –

+0

Существует очень мало доказательств того, что вы действительно говорите о проблеме инверсии приоритета в этом комментарии. Использование SyncLock в вашем коде чревато множеством проблем, тупик и голод наиболее распространены, но не имеют ничего общего с проблемой инверсии приоритета. Читайте книгу об этом, чтобы не беспокоиться. –

Смежные вопросы