Если вы хотите обработать все элементы в конвейере до того, как процесс остановится, я не думаю, что я на самом деле использовал бы ловушку отключения - я бы явно отключил конвейер в основном коде и ждал его завершить, прежде чем дать основному потоку закончить. Я предлагаю вам либо изменить метод close()
на блокирование до завершения конвейера, либо добавить отдельный метод (например, waitForPipelineToEmpty()
).
Таким образом, вы можете сделать все это более управляемым - в частности, это означает, что вы не будете пытаться обрабатывать вещи, пока другие части системы убираются в ловушках отключения.
Один из альтернативных способов завершения очереди производителя / потребителя состоит в том, чтобы иметь значение Sentinel, которое означает «остановить сейчас». Затем вы просто подаете это в конец конвейера (и не добавляете больше «реальных» значений) - и ваш процессор просто останавливается, когда видит этот элемент.