Если вы используете именованные каналы (pipeDevCreate (), write (), read ()) вместо очередей сообщений, вы можете использовать select () для блокировки до тех пор, пока в каком-либо канале нет сообщений.
Всякий раз, когда срабатывает select (), вы обрабатываете все сообщения в канале с высоким приоритетом. Затем вы обрабатываете одно сообщение из канала с низким приоритетом. Затем снова вызовите select (loop).
Примеры фрагментов кода:
// Initialization: Create high and low priority named pipes
pipeDrv(); //initialize pipe driver
int fdHi = pipeDevCreate("/pipe/high",numMsgs,msgSize);
int fdLo = pipeDevCreate("/pipe/low",numMsgs,msgSize);
...
// Message sending thread: Add messages to pipe
write(fdHi, buf, sizeof(buf));
...
// Message processing Thread: select loop
fd_set rdFdSet;
while(1)
{
FD_ZERO(&rdFdSet);
FD_SET(fdHi, &rdFdSet);
FD_SET(fdLo, &rdFdSet;
if (select(FD_SETSIZE, &rdFdSet, NULL, NULL, NULL) != ERROR)
{
if (FD_ISSET(fdHi, &rdFdSet))
{
// process all high-priority messages
while(read(fdHi,buf,size) > 0)
{
//process high-priority
}
}
if (FD_ISSET(fdLo, &rdFdSet))
{
// process a single low priority message
if (read(fdLo,buf,size) > 0)
{
// process low priority
}
}
}
}