Насколько я знаю, для него нет универсальной реализации, кроме самого MPI API.Вы должны использовать правильные функции в соответствии с ограничениями задачи.
Если вы пытаетесь создать простую синхронизированную очередь заданий / данных n-производителей-и-потребителей, то, конечно, уже есть многореализации (просто Google, и вы должны получить несколько).
Тем не менее, способ, которым вы представляете, кажется очень общим - иногда вы хотите, чтобы данные были отправлены только одному потребителю, иногда всем ими т. д. В этом случае вы должны выяснить, что вы хотите и когда, и использовать либо функции двухточечной связи, либо функции коллективной связи, соответственно (и, конечно, каждый должен знать, чего ожидать - вы не можетеПусть потребитель ждет данных из одного источника, а производитель хочет транслировать данные ...).
Все это в стороне, вот одна из реализаций, которая приходит на ум, которая, кажется, отвечает всем вашим требованиям.:
Создайте синхронизированную очередь, производители помещают данные в один конец, потребители получают их издругой (выбирайте все виды поведения для очереди по мере необходимости - ограничен ли размер очереди, добавляется ли элемент в полный блок очереди или нет, удаляется ли элемент из пустого блока очереди или происходит сбой и т. д.).
Предполагая, что данные содержат некоторый флаг, который сообщает потребителям, предназначены ли эти данные для всех или только для одного из них, потребители просматривают и либо удаляют элемент, либо оставляют его там и просто отмечают, что они уже сделали это (либосохранение его идентификатора локально или путем изменения флага в самих данных).
Если вы не хотите, чтобы один блок коллективных данных блокировался до тех пор, пока все с ним не разбираются, вы можете использовать 2 очереди, по одной для каждого типаданные, и потребители будут получать данные из одной из очередей одновременно (либо каждый раз выбирая другую очередь, произвольно выбирая очередь, назначая приоритет одной из очередей, либо по некоторому принятому порядку, который выводится из данных (например,сначала самый низкий идентификатор)).
Извините за длинный ответ, и я надеюсь, что это поможет:)