Проблемы с конфигурацией пула потоков - PullRequest
0 голосов
/ 17 февраля 2011

Обратите внимание, что я не говорю о какой-либо конкретной реализации на каком-либо конкретном языке.

Допустим, у меня есть пул потоков и очередь задач. Когда поток запускается, он извлекает задачу из очереди задач и обрабатывает ее - в результате этот поток может добавить дополнительные задачи в очередь задач. Время, которое поток должен выполнить для выполнения определенной задачи, не ограничено, то есть поток работает до тех пор, пока задача не будет завершена и никогда не завершится до этого.

Какие проблемы (например, взаимоблокировки) подвержены каждой из следующих конфигураций пула потоков?

Возможные конфигурации пула потоков, с которыми я связан:
1) Неограниченная очередь задач с ограниченным числом. потоков
2) Ограниченная очередь задач с неограниченным числом. потоков
3) Ограниченная очередь задач с ограниченным числом. темы.
4) Неограниченная очередь задач с неограниченным числом. темы

Также - скажем, что теперь поток имеет ограниченное время для обработки каждой задачи и принудительно завершается, если не завершает задачу в заданный период времени. Как это меняет вещи?

1 Ответ

2 голосов
/ 18 февраля 2011

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

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

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

Если у вас неограниченное количество потоков, вам нужно следить за переподпиской - если у меня есть квад-core, но отправьте 1000 задач и запустите 1000 потоков, тогда они будут конкурировать друг с другом и замедлять все.

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

Вы всегда можете получить взаимоблокировку с 2 задачами, если они ждут друг друга, независимо от используемой вами схемы, если только вы не начинаете принудительно завершать задачи по истечении определенного времени.

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

...