Почему плохо приостанавливать / прерывать потоки?

#c# #.net #multithreading #thread-safety #parallel-processing

#c# #.net #многопоточность #безопасность потоков #параллельная обработка

Вопрос:

Моя модель работы потоков заключается в том, что some ThreadManager дает каждому потоку поворот. Когда очередь за потоком, он выполняет несколько строк кода.

Чтобы приостановить поток, нельзя ли просто ThreadManager (на мгновение) прекратить разрешать этому потоку выполнять поворот?

Чтобы прервать поток, не мог ThreadManager просто никогда не давать этому потоку другого хода?

В чем проблема?

Ответ №1:

Цитата из MSDN о приостановке потоков:

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

Прерванный поток может привести к непредсказуемым обстоятельствам. Об этом есть хорошая статья:http://www.bluebytesoftware.com/blog/2009/03/13/ManagedCodeAndAsynchronousExceptionHardening.aspx

Ответ №2:

Я согласен с Алексом, но для дальнейшей разработки, если вам нужно «приостановить» поток, вероятно, будет лучше посмотреть на какой-то механизм блокировки, такой как семафоры, мьютексы или один из многих других доступных.

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