Поэтому я работаю над системой заданий, где потоки в пуле извлекают задания из очереди и запускают их, и каждое задание потенциально может ставить в очередь другие задания. В настоящий момент очередь не заблокирована, и все потоки ожидают семафор, который увеличивается по мере добавления заданий, а не ожидания занятости.
Теперь я пытаюсь добавить возможность ставить в очередь задания для запуска в главном потоке, что, на мой взгляд, так же просто, как иметь вторую очередь, из которой может извлекать только основной поток, но у меня возникают проблемы с выяснением, как удерживать основной поток от занятого ожидания.
Если я сохраню текущее поведение ожидания на семафоре, основной поток проснется, когда задания будут добавлены в глобальную очередь, а не когда они будут добавлены в очередь основного потока, что является проблемой.
Я мог бы иметь второй семафор, который отслеживает задания в очереди основного потока, но, насколько я могу судить, Windows является единственной платформой, которая позволяет ожидать несколько семафоров одновременно (через WaitForMultipleObjects
), а система должна быть кроссплатформенной.
Я мог бы, вероятно, сделать это с помощью условных переменных, но, как я уже сказал, базовые очереди не блокируются, и std::mutex
медленный. Мне действительно не нравится идея использовать фиктивные замки для начала, особенно если они должны быть std::mutex
эс.
Я также мог бы заставить основной поток игнорировать глобальную очередь и извлекать задания только из своей собственной очереди и ждать на своем собственном семафоре. Таким образом, я мог бы просто создать еще один рабочий поток и позволить ОС отменять планирование основного потока, пока он ждет работы. , Но мне не нравится идея использования переключений контекста всякий раз, когда кто-то хочет использовать основной поток.
Кажется, что это должно быть довольно распространенным поведением для любой системы работы, но мне не повезло найти примеры для изучения. Есть ли подход, который я здесь пропускаю?
Задача ещё не решена.
Других решений пока нет …