Проблемы с конфигурацией пула потоков

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

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

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

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

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

1 ответ

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

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

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

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

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

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

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

Другие вопросы по тегам