Синхронизация и взаимодействие программных потоков в операционной среде реального времени. Дорогов А.Ю. - 50 стр.

UptoLike

Составители: 

50
void handler( signo ) // обработчик сигнала SIGUSR1
{
static int first = 1;
if( first ) {
first = 0;
kill( getpid(), SIGUSR1 ); // маскированный сигнал
kill( getpid(), SIGUSR2 ); // маскированный сигнал
}
}
В данном примере сигнал SIGUSR1, посланный из потока main(), вызы-
вает обработчик handler(). Обработчик генерирует еще 2 сигнала SIGUSR1
и SIGUSR2, однако эти сигналы маскированы, до тех пор пока не произой-
дет возврат к main(). После возврата вновь вызывается обработчик для ви-
сящего сигнала SIGUSR1. Сигнал обрабатывается, но для висящего сигна-
ла SIGUSR2 обработчик не определен, что приводит к завершению процес-
са.
Таблица 3.9
Функция Назначение
sigemptyset() Очистить список обрабатываемых сигналов
sigaddset() Добавить сигнал в список
sigdelset() Удалить сигнал из списка
sigfillset() Добавить в список все сигналы
sigismember() Проверить наличие сигнала в списке
В примере использованы сервисные функции для формирования спи-
ска обрабатываемых сигналов. Полный набор сервисных функций приведен
в табл. 3.9.
3.7. Иерархический принцип обмена синхронными сообщениями
Используемый принцип синхронизации сообщений (через вызовы
MsgSend(), MsgReceive(), MsgReply()) заставляет следовать строгой иерар-
хии при организации взаимодействия между потоками. В частности, это оз-
начает, что 2 потока никогда не должны посылать сообщения друг другу,
так как это с большой вероятностью приводит к взаимной блокировке. В та-
ком состоянии оба потока будут ожидать друг от друга ответ на посланные
сообщения, но не смогут дать его, поскольку оба блокированы. Для исклю-
чения подобной ситуации обмен должен быть организован так, чтобы каж-
дый поток занимал свой уровень иерархии и все потоки данного уровня по-
сылали сообщения только потокам более высокого уровня, а не своего или
низшего (рис. 3.5).
Способ назначения уровней иерархии заключается в том, чтобы в це-
почке доступа разместить наиболее удаленного клиента на самом нижнем