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

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

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

И если мне нужно создать межпотоковый конвейер, почему бы больше библиотек, реализующих общие очереди, не позволить вам создать общую очередь и межпотоковый конвейер как единое целое?

Означает ли тот факт, что я вообще хочу это сделать, фундаментальный недостаток дизайна?

Я спрашиваю об этом и о C ++, и о Python. И я' m слегка заинтересован в кроссплатформенном решении, но в первую очередь интересуется Linux.

Для более конкретного примера ...

У меня есть некоторый код, который будет искать что-то в дереве файловой системы. У меня есть несколько каналов связи, открытых для внешнего мира через розетки. Будут приходить запросы, которые могут (или не могут) привести к необходимости поиска чего-либо в дереве файловой системы.

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

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

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

Стандартный способ ожидания пустой очереди - использовать условную переменную. Но это не сработает, если мне нужно будет обслуживать другие запросы, пока я жду. Либо я все время опрашиваю очередь результатов (и задерживаю результаты в среднем на половину интервала опроса), блокируя и не обслуживая запросы.

16
задан Omnifarious 2 April 2011 в 18:10
поделиться