Обновление: я не являюсь обычным пользователем StackOverflow, поэтому извиняюсь, но я не вижу способа отправить это лично по электронной почте модераторам. Я думаю, что было очень несправедливо и жестко блокировать эту тему как отключенную topi c и говоря, что я должен опубликовать пример кода et c. Я уже объяснил, что это большое сложное приложение, мне пришлось бы публиковать десятки строк кода, это было бы непонятно для всех. Не все программные проблемы настолько просты, что сводятся к 10 строкам примера кода!
Фундаментальная проблема - архитектурная, я изо всех сил пытался объяснить, что у меня есть 2 асин c потока, которые должны заблокировать два ресурсы, затем эти 2 блокировки также доступны в главном потоке. Из-за асин c природы. Я не могу понять, как я могу контролировать порядок блокировок и чередование двух блокировок, чтобы всегда гарантировать отсутствие взаимоблокировок.
Да, как и предполагалось, я могу сделать всего одну блокировку, чтобы заблокировать все, но снижение производительности было бы очень плохим, поэтому я не могу выбрать это простое решение. Я надеялся, что есть более производительное решение classi c, когда вам нужно несколько блокировок в сценарии asyn c.
В любом случае, спасибо за ответы, которые я получил, до того как он был закрыт, я ценю ваше время и помогите в эти трудные времена.
С уважением
Я пишу довольно большое приложение в C#, оно имеет 2 асинхронных потока, один получает поток данных о цене товара, и один получает подробный поток заказа.
Каждый из этих потоков строит список входящих данных о цене / заказе, каждый из которых использует свой собственный ReaderWriterLockSlim. Устанавливается в режиме блокировки записи, когда входящие данные перемещаются в списки.
Частота входящих потоков очень различна и непредсказуема, иногда пакеты цены товара могут поступать со скоростью 10 i sh миллис. c интервалов, так что мне нужно эффективно кодировать, иначе получится очень медлительно sh.
Изначально я просто читал списки в главном потоке (блокировка чтения ReaderWriterLockSlim), это работало нормально. Однако теперь у меня есть требование, чтобы в главном потоке иногда приходилось делать записи в оба списка данных. Да, как вы уже догадались, с дополнительными блокировками записи, я теперь получаю случайные взаимоблокировки, я уверен, что это классическая блокировка c, вызванная чередованием доступа к двум отдельным блокировкам.
Из-за самой асинхронности c характер моих входящих данных, я не могу предсказать, когда эти потоки будут записывать или читать блокировку списков, в зависимости от того, какую обработку мой основной поток выполняет в двух списках.
Насколько я могу видите, это всегда будет склонно к тупику. Я ужасно застрял в том, как я могу изменить архитектуру для решения этой тупиковой проблемы.
Я был бы очень признателен, если бы кто-нибудь мог высказать некоторые мысли о том, как эта проблема может быть решена.
Пример кода. Один поток запускает этот код:
lock (locker1)
{
list1.Add("Something");
lock (locker2)
{
list2.Add("Something");
}
}
... в то время как другой поток запускает этот код:
lock (locker2)
{
list2.Add("Something");
lock (locker1)
{
list1.Add("Something");
}
}
Можно ли избежать следующих тупиков, не вводя ограничений в том порядке, что замки взяты?