Есть множество процессов. В каждом процессе есть список задач. В каждом процессе по 2 потока.
Первый поток вычисляет задачи. Если задачи закончились, он запрашивает новые у других процессов.
Второй поток ждет запросов от других процессов. Если пришел запрос, и есть лишние задачи, то он их отдает другому процессу.
На машине, на которой будет работать данная система, mpi может работать только с флагом MPI_THREAD_SERIALIZED (программист обещает, что потоки не будут вызывать функции MPI одновременно). Поэтому возник вопрос: Как реализовать ожидание сообщений во втором потоке? Если правильно понимаю, то блокирующие операции типа mpi_recv не подходят, так как первому потоку тоже нужно пользоваться функциями mpi. Неблокирующий прием mpi_irecv тоже не подходит, потому что прием может начаться в любой момент (а в этот момент первый поток может использовать функции mpi).
Как реализовать ожидание сообщений во втором потоке?
Можно просто захватывать мьютекс на время выполнения приёма данных. Однако, исходя из здравого смысла, ваша "многопоточность" будет сводиться к тому, что потоки станут работать поочерёдно. Можно использовать только один поток, т.к. MPI в принципе подразумевает выделение процессов под количество вычисляющих ядер в системе и наличие второго потока будет лишь притормаживать работу. В таком случае, ваш процесс может принимать данные о задаче в неблокирующей манере в какой-нибудь буфер, где после выполнения задачи будет проводиться проверка на наличие новых задач.