«Остановка» не часто обсуждается, потому что часто это никогда не делается.В тех случаях, когда это требуется, зачастую так же просто и более гибко ставить ядовитую таблетку с использованием самого высокоуровневого протокола ПК, как и для добавления дополнительных функций в саму очередь.
Если вы действительно хотите это сделать, вы действительно можете установить флаг, который заставляет каждого потребителя вызывать исключение, либо «немедленно», либо всякий раз, когда он возвращается в очередь, но есть проблемы.Вам нужен метод «сделано», чтобы быть синхронным, т.е.хотите ли вы, чтобы все потребители ушли к тому времени, когда «готово» вернулось, или асинхронно, т.е.последний потребительский поток вызывает параметр события, когда все остальные потребители исчезли?
Как вы собираетесь устроить тех потребителей, которые в настоящее время ждут, чтобы проснуться?Сколько из них ждут, а сколько заняты, но вернутся в очередь, когда выполнят свою работу?Что если один или несколько потребителей застрянут на блокирующем вызове (возможно, их можно разблокировать, но для этого требуется вызов из другого потока - как вы собираетесь это сделать)?
Как потребители собираются уведомить, что они обработали свое исключение и собираются умереть?Достаточно ли "умереть" или вам нужно подождать с дескриптором потока?Если вам нужно ждать на дескрипторе потока, что будет делать ожидание - поток, запрашивающий отключение очереди или последний потребительский поток, чтобы уведомить?
О да - чтобы быть в безопасности, вы должны договориться с производителемпотоки, которые появляются с объектами, чтобы стоять в очереди, находясь в состоянии «выключения», чтобы также вызвать исключение.
Я поднимаю эти вопросы, потому что я сделал все это однажды, давным-давно.В конце концов, все заработало.Все объекты, находящиеся в очереди, должны были иметь «QueuedItem», вставленный в их цепочку наследования (чтобы метод отмены задания мог быть открыт для очереди), и очередь должна была поддерживать поточно-безопасный список объектов, которые быливыталкиваемый потоками, но еще не обработанный.
Через некоторое время я перестал использовать класс в пользу простой очереди ПК без специального механизма выключения.