Відмінне запитання. Я не можу пригадати наш курс CS 102, в якому згадувались про одну заявку на подвійну чергу.
На сьогоднішній день єдиним мені відомим додатком є планувальник роботи з викрадення робіт, згаданий у статті Вікіпедії .
Він працює по суті так:
У звичайній однопотоковій процедурній моделі кожен виклик функції висуває запис активації на так званому стеку викликів . Запис активації містить локальні змінні та параметри цього виклику. Після того, як виклик методу завершено ("повертається"), останній запис активації вискакує зі стека викликів.
Це особливо важливо, оскільки саме так реалізується рекурсія: структура рекурсії представлена в поточному стані стека викликів.
Паралелізуючи рекурсивний алгоритм, ми можемо використовувати цю властивість, замінивши стек виклику чергою викликів. Кожен потік у обчисленні отримує власну чергу дзвінків і штовхає та записує записи активації, як у послідовному виконанні.
Але як тільки нитка закінчила свою роботу (= черга виклику порожня), вона вкрадає роботу з іншого потоку, видаляючи запис активації з черги виклику цього потоку, видаляючи з "неправильного" кінця.
По суті, черга дзвінків виконує функції двох стеків викликів, які тепер обслуговують два потоки.