Может ли этот фрагмент кода быть поврежден в .NET при прерывании потока - PullRequest
0 голосов
/ 15 апреля 2010

Маленькое вступление:

В сложных многопоточных приложениях (корпоративная сервисная шина ESB) мне нужно использовать Thread.Abort, потому что этот ESB принимает написанные пользователем модули, которые взаимодействуют с аппаратными модулями безопасности. Поэтому, если этот модуль блокируется или аппаратное обеспечение перестает отвечать на запросы - мне нужно просто выгрузить этот модуль, а оставшаяся часть этого сервера приложений должна оставаться запущенной.

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


public void StopAbortSection()
        {
            var id = Thread.CurrentThread.ManagedThreadId;
            lock (threadIdMap[id])
            {
                ....
            }
        }

Например, модуль находится в AbortSection (введен путем вызова аналогичного метода StartAbortSection), и ServerAplication решает прервать пользовательский модуль, но после этого решения, но до фактического Thread.Abort, модуль входит в NonAbortableSection, вызывая этот метод, но блокировка фактически выполняется этот объект блокировки.

Таким образом, блокировка будет блокироваться до тех пор, пока не будет выполнен Abort, но прерывание может быть выполнено и до достижения этого блока в этом коде Но Object с этим методом важен, и мне нужно быть уверенным, что этот фрагмент кода безопасен для прерывания в любой момент (не повреждается - например, я не знаю, что происходит при чтении из Dictionary ..).

Поэтому я должен упомянуть, что threadIdMap - это Словарь (int, ManualResetEvent), а объект блокировки - это экземпляр ManualResetEvent.

Надеюсь, теперь вы поняли мой вопрос. Извините за его величие.

1 Ответ

1 голос
/ 15 апреля 2010

Что вы подразумеваете под "нарушением" исключения?

ThreadAbortException может быть выброшено в любом месте кода. Блокировка не влияет на это вообще, если только один поток не прерывает другой, код для прерывания потока находится внутри блокировки, а потоки блокируются на одном и том же объекте.

Потоки должны блокироваться на одном и том же объекте, чтобы быть эффективными. Если в словаре нет разных элементов, содержащих ссылки на одни и те же объекты ManualResetEvent, блокировка совершенно бесполезна.

...