… для использования на многопоточном сетевом сервере.
Я хочу передавать данные между несколькими streamами. В настоящее время я использую сокеты с блокировкой главного streamа на select () и блокировкой рабочих элементов на recv (), хотя я считаю, что, вероятно, существуют более продвинутые или предварительно упакованные способы обработки этой задачи на C ++.
У меня были бы рабочие streamи, ожидающие в пуле streamов.
Затем мастер ожидает выбора (для чтения и записи).
По мере поступления данных мастер добавляет задания в пул streamов. По мере добавления каждого задания stream пробуждается, выполняет задание и возвращается в пул. Таким образом, вы не блокируете streamи, ожидающие определенных портов с помощью recv (), и фиксированный набор дочерних streamов может обрабатывать весь входящий трафик.
Текущие библиотеки, поддерживающие эту функциональность в готовых объектах:
Вы можете попробовать библиотеку ACE, которая поставляется с каналами и очередями сообщений, которые специально подходят для межпоточной связи.
** ACE означает адаптивную среду связи *
libthread из plan9port включает структуру канала, которая будет очень похожа; обратите внимание на вклад Русса Кокса как в plan9port, так и в go-lang, а также в историю libthread :
Двигаясь в другом направлении, Luca Cardelli и Rob Pike разработали идеи в CSP на мини-языке Squeak [4] для генерации кода пользовательского интерфейса. (Этот писк отличается от реализации Squeak Smalltalk.) Пайк позже расширил Squeak на полноценный язык программирования Newsqueak [5] [6], который родил Алеф Плана 9 [7] [8], Limbo Inferno [9] и Google Пойдите [13].
На более позднем этапе истории Plan 9 стало слишком много усилий для поддержания инфраструктуры на двух языках, поэтому Alef был прекращен, а конструкции CSP портированы на C в виде libthread.
Итак, поскольку каналы go по сути являются прямым потомком от libthread, я не думаю, что вы найдете что-то более похожее 🙂
Возможно, ZeroMQ может стоить проверить. Он имеет канал «inproc», который позволяет вам общаться между streamами. Конечно, вы можете отправлять строки только между streamами, а не объектами, но, с другой стороны, он поддерживает другие транспорты, такие как TCP / IP (так что вы можете легко обмениваться данными между процессами в сети), является кросс-платформенным и имеет привязки языка для большинства текущих языки.
« Канал – буферизованная или небуферизованная очередь для сообщений фиксированного размера » ( thread9 ).
В TBB есть буферная очередь: concurrent_bounded_queue .
И я только что реализовал своего рода небуферизованный канал в C ++ 11: https://gist.github.com/ArtemGr/7293793 . Хотя более общая реализация заключалась бы в создании пары ссылок (например, в Felix mk_ioschannel_pair ), по одному для каждой конечной точки канала, чтобы прервать любое ожидание, если другой конец канала больше не существует.