Поиск библиотеки C или C ++, обеспечивающей функциональность, похожую на каналы Google Go

… для использования на многопоточном сетевом сервере.

Я хочу передавать данные между несколькими 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 ), по одному для каждой конечной точки канала, чтобы прервать любое ожидание, если другой конец канала больше не существует.