Страницы

Поиск по вопросам

пятница, 12 июля 2019 г.

Атомарные функции unix

Всем добрый день! Подскажите плиз, есть ли в unix-подобных системах возможность создать свою функцию, которая выполнялась бы атомарно (так, чтобы планировщик не передавал управление никаким другим потокам, пока не завершит ее выполнение) ?


Ответ

@margosh, лично я обычно во всех обработчиках всех сигналов просто выставляю флаг (в volatile int переменной). (В тестовом режиме не боюсь вызывать printf()). Если обработчик сигнала и функции, которые этот сигнал интересует, хорошо локализуются по смыслу задачи, то я пишу их в одном файле и флаг объявляю static, иначе делаю флаг extern. Безусловно, проверка флага с целью выполнения каких-то действий и затем его сброса должна быть защищена мьютексом (от потоков) и sigprocmask() (от сигнала). Видимо у Вас, при такой схеме, один из потоков (планировщик) должен иметь маску сигналов, разрешающую SIGTERM, а все остальные маску с заблокированным SIGTERM. В таком случае прерывание ожидания (read(), select(), sigpause(), sleep() и т.п.) после обработки сигнала произойдет именно в нужном, а не в произвольном потоке. Иначе планировщик может никогда изменения флага не увидеть. Другое решение состоит в записи (системным вызовом write()) обработчиком сигнала в pipe некоторой "команды". В дальнейшем какой-то поток (в Вашем случае планировщик) может прочесть ее и выполнить необходимые действия. IMHO что-то в таком духе (по крайней мере в Linux). Вообще же, очень часто, достаточно SIGTERM просто не ловить т.к. на самом деле никакие реально нужные ресурсы не пропадают. Вы просто для себя рассмотрите случай с SIGKILL в произвольный момент - катастрофа произойдет ? Отловить завершение и зафиксировать в логах можно враппером.

Комментариев нет:

Отправить комментарий