Короткий и содержательный ответ заключается в том, что авторы класса TThread не доверяли разработчикам читать или понимать документацию. :)
Приостановка и возобновление потока — допустимая операция только для очень ограниченного числа случаев использования. На самом деле, это ограниченное количество по сути равно "одному": Отладчики.
Нежелательные
Причина, по которой это считается нежелательным (по меньшей мере), заключается в том, что могут возникнуть проблемы, если поток приостановлен, когда (например) он владеет блокировкой на каком-либо другом объекте синхронизации, таком как мьютекс или семпахор и т. д.
Эти объекты синхронизации специально разработаны для обеспечения безопасной работы потока по отношению к другим потокам, получающим доступ к общим ресурсам, поэтому прерывание и вмешательство в эти механизмы могут привести к проблемам.
Отладчику нужна возможность напрямую приостанавливать поток независимо от этих механизмов по удивительно схожим причинам.
Рассмотрим, например, что точка останова включает неявную (или можно даже сказать exявную) операцию «приостановить» в потоке. Если отладчик останавливает поток, когда он достигает точки останова, он также должен приостанавливать все остальные потоки в этом процессе именно потому, что в противном случае они будут мчаться вперед, выполняя работу, которая может помешать многим низкоуровневым задачам, которые могут быть запрошены отладчиком. тогда делай.
Сильная рука отладчика
Отладчик не может «внедрить» красивые, вежливые объекты и механизмы синхронизации, чтобы запросить, чтобы эти другие потоки приостановили себя скоординированным образом с каким-либо другим потоком, который был бесцеремонно остановлен (точкой останова). У отладчика нет другого выбора, кроме как усилить потоки, и именно для этого и предназначены API Suspend/Resume.
Они предназначены для ситуаций, когда вам нужно остановить поток "Прямо сейчас. Что бы вы ни делали, мне все равно, просто остановитесь!". А позже, чтобы затем сказать: «Хорошо, теперь вы можете продолжать то, что вы делали раньше, что бы это ни было.».
Потоки с хорошим поведением ведут себя хорошо по отношению друг к другу
Должно быть совершенно очевидно, что это не, как поток с хорошим поведением взаимодействует с другими потоками при нормальной работе (если он хочет поддерживать состояние «нормальной» работы и не создавать всевозможных проблем). . В этих обычных случаях поток очень делает и должен заботиться о том, что делают другие потоки, и следить за тем, чтобы он не мешал, используя соответствующие методы синхронизации для координации с те другие темы.
В этих случаях законный вариант использования для возобновления потока аналогичным образом сводится только к одному, одиночному режиму. То есть вы создали и инициализировали поток, который вы не хотите запускать немедленно, а начать выполнение в какой-то более поздний момент времени под управлением какого-то другого потока.
Но как только этот новый поток был запущен, последующая синхронизация с другими потоками должна быть достигнута с использованием этих надлежащих методов синхронизации, а не не грубой силой приостановки Это.
Пуск против приостановки/возобновления
Поэтому было решено, что Suspend/Resume не имеет реального места в классе потоков общего назначения (люди, реализующие отладчики, все еще могут напрямую вызывать Windows API), а вместо этого более подходящий " Предусмотрен механизм «Пуск».
Надеюсь, должно быть очевидно, что, несмотря на то, что этот механизм Start использует тот же API, что и устаревший метод Resume, цель которого совершенно другая.
person
Deltics
schedule
15.03.2016
TThread.AfterConstruction
запустит поток, когда все конструкторы, даже производные конструкторы, будут завершены. - person David Heffernan   schedule 15.03.2016CreateThread
- person Sir Rufo   schedule 15.03.2016CREATE_SUSPENDED
не передается, то поток может начать выполнение до того, какCreateThread
вернется. Специфическое поведение Windows Server 2003 описано в предыдущем абзаце документации и связано с маркерами и олицетворением. - person David Heffernan   schedule 15.03.2016constructor Create(CreateSuspended: Boolean);
НЕ устарел, в то время какResume
. - person Jerry Dodge   schedule 15.03.2016Start
. Просто как тот. - person David Heffernan   schedule 15.03.2016