Да что тут подробнее. Все ж очевидно. Собираешь все запросы на обработку сообщений в один вектор (байт, слово...). Единичный бит в нем - флаг запроса на обработку. Если вектор ненулевой, значит есть запросы, нулевой - запросов нет. Обычно бит запроса сбрасывается родным обработчиком, но у тебя есть такие обработчики, которые должны сбрасывать и не родные запросы. Ну ты и сбрасываешь одной командой родные и не родные флаги (маскируешь по И). А если нет запроса, то не важна и его расшифровка.
Ну а реализация - суперлуп (петля), в котором опрашивается вектор и если он не нулевой, то по номеру бита с "1" идет обращение к п/п обработки соответствующего запроса. Она и сбрасывает свой флаг (бит), а заодно и другие, связанные с ним.
Устанавливать флаги можно в прерываниях, а можно в сопрограмме (сопрограммах) - аналогичных суперлупах. Переход между сопрограммами (потоками, параллельно работающими программами) - уж как задача и душа пожелает. Можно даже на нескольких процессорах...