Оптимально ли удерживать нить? - PullRequest
8 голосов
/ 25 сентября 2008

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

Итак, мой вопрос, что является более оптимальным с точки зрения производительности процессора: приостановить поток, когда он не используется, или оставить его в живых и использовать функцию WaitForSingleObject для ожидания сигнала от основного процесса?

Ответы [ 6 ]

15 голосов
/ 25 сентября 2008

С точки зрения используемых ресурсов ЦП оба решения одинаковы: поток, который приостановлен, и поток, ожидающий в WaitForSingleObject для объекта, который не был сигнализирован, не получают циклов ЦП вообще.

Тем не менее, WaitForSingleObject почти всегда является предпочтительным решением, потому что код, использующий его, будет намного более "естественным" - его легче читать и легче делать правильно. Приостановка / возобновление потоков может быть опасным, потому что вам нужно быть очень осторожным, чтобы убедиться, что вы знаете, что приостановите поток в состоянии, в котором приостановка не принесет вреда (представьте, что приостановка потока, который в настоящее время содержит мьютекс).

6 голосов
/ 25 сентября 2008

Я бы предположил, что Андрей не использует Delphi для написания .NET, и поэтому Suspend не переводит в System.Threading.Thread.Suspend, а в SuspendThread Win32 API.

Я бы настоятельно рекомендовал против этого. Если вы приостанавливаете поток в произвольный момент, то вы не знаете, что произойдет (например, вы можете приостановить поток в таком состоянии, когда какой-то общий ресурс заблокирован). Однако, если вы уже знаете, что поток находится в состоянии приостановки, просто используйте WaitForSingleObject (или любой другой вызов WaitFor) - он будет в равной степени эффективен, как и приостановка потока, то есть поток будет использовать нулевое время ЦП до его пробуждения.

1 голос
/ 30 сентября 2008

Смотрите отличное руководство по многопоточности в Delphi: Учебник по многопоточности

1 голос
/ 25 сентября 2008

Если это рабочий поток, которому внешние единицы заданы, ему определенно следует использовать объекты сигнализации, поскольку это обеспечит бесполезную загрузку ЦП.

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

1 голос
/ 25 сентября 2008

Что вы подразумеваете под "приостановить"? WaitForSingleObject приостановит поток, то есть не будет использовать процессор, пока не поступит сигнал.

0 голосов
/ 11 сентября 2011

Другим вариантом может быть TMonitor, представленный в Delphi 2009, который имеет функции, такие как Wait, Pulse и PulseAll, чтобы сохранять неактивные потоки, когда им нечего делать, и уведомлять их, как только они должны продолжить свою работу. Он слабо моделируется после блокировки объекта в Java. Как и там, объект Delphi теперь имеет поле «блокировки», которое можно использовать для синхронизации потоков.

Блог, в котором приведен пример для класса многопоточной очереди, можно найти по адресу http://delphihaven.wordpress.com/2011/05/04/using-tmonitor-1/

К сожалению, в реализации TMonitor была ошибка, которая, похоже, исправлена ​​в XE2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...