Отличный вопрос. Я не могу вспомнить наш курс по CS 102, в котором упоминалось одно приложение для двусторонней очереди.
На сегодняшний день единственным известным мне приложением является планировщик кражи работы, упомянутый в статье в Википедии .
Это работает по существу следующим образом:
В нормальной однопоточной процедурной модели каждый вызов функции помещает запись активации в так называемый стек вызовов . Запись активации содержит локальные переменные и параметры этого вызова. После завершения вызова метода («возврата») последняя запись активации извлекается из стека вызовов.
Это особенно важно, потому что именно так реализована рекурсия: структура рекурсии представлена в текущем состоянии стека вызовов.
При распараллеливании рекурсивного алгоритма мы можем использовать это свойство, заменив стек вызовов очередью вызовов. Каждый поток в вычислении получает свою очередь вызовов, выдвигает и выскакивает записи активации, как при последовательном выполнении.
Но как только поток завершил свою работу (= его очередь вызовов пуста), он крадет работу из другого потока, удаляя запись активации из очереди вызовов этого потока, удаляя ее с «неправильного» конца.
По сути, очередь вызовов действует как два стека вызовов, которые теперь обслуживают два потока.