Я хотел бы создать поток для выполнения определенных задач и использовать потокобезопасную очередь для связи с ними. Я также хотел бы делать IO для различных файловых дескрипторов, пока я жду.
Какой рекомендуемый способ выполнить это? Должен ли я создать межпоточный канал и написать ему, когда очередь переходит от каких-либо элементов к некоторым элементам? Разве нет лучшего способа?
И если мне нужно создать межпоточный канал, почему не больше библиотек, реализующих общие очереди, вы можете создать общую очередь и межпоточный канал как единый объект?
Является ли тот факт, что я хочу сделать это вообще, подразумевает фундаментальный недостаток дизайна?
Я спрашиваю об этом как для С++, так и для Python. И я немного заинтересован в кросс-платформенном решении, но в первую очередь заинтересован в Linux.
Для более конкретного примера...
У меня есть код, который будет искать материал в дереве файловой системы. У меня есть несколько каналов связи, открытых для внешнего мира через сокеты. Запросы, которые могут (или не могут) привести к необходимости поиска материала в дереве файловой системы, будут поступать.
Я собираюсь изолировать код, который ищет материал в дереве файловой системы в одном или нескольких потоках. Я хотел бы получить запросы, которые приведут к необходимости поиска в дереве и поместить их в потокобезопасную очередь вещей, которые должны выполняться поисковыми потоками. Результаты будут помещены в очередь завершенных запросов.
Я хочу иметь возможность быстро обслуживать все запросы без поиска во время поиска. Я бы хотел, чтобы своевременно действовать по результатам поиска.
Обслуживание входящих запросов обычно подразумевает какую-то управляемую событиями архитектуру, которая использует epoll
. Очередь запросов на поиск дисков и обратная очередь результатов будут представлять собой потокобезопасную очередь, которая использует мьютексы или семафоры для обеспечения безопасности потоков.
Стандартный способ ожидания в пустой очереди - использовать переменную условия. Но это не сработает, если мне нужно будет обслуживать другие запросы, пока я жду. Либо я заканчиваю опрос очереди результатов все время (и в среднем задержку результатов на половину интервала опроса), блокирование и отсутствие запросов на обслуживание.