многопоточность — множественный производитель, многократный потребитель, производящий для определенного потребителя без ожидания ожидания

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

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

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

Я мог бы иметь второй семафор, который отслеживает задания в очереди основного потока, но, насколько я могу судить, Windows является единственной платформой, которая позволяет ожидать несколько семафоров одновременно (через WaitForMultipleObjects), а система должна быть кроссплатформенной.

Я мог бы, вероятно, сделать это с помощью условных переменных, но, как я уже сказал, базовые очереди не блокируются, и std::mutex медленный. Мне действительно не нравится идея использовать фиктивные замки для начала, особенно если они должны быть std::mutexэс.

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

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

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]