Приложение многопоточное. Внутри main()
я регистрирую обработчик сигнала для SIGUSR1:
// Global variable to indicate whether directory's
// content needs to be reloaded
bool reload_dir = 0;
int main (int argc, char *argv[])
{
...
signal(SIGUSR1, sigusr1_handler);
...
RunServer(arg1, ...);
return 0;
}
Обработчик сигнала:
static void
sigusr1_handler (int signo __unused)
{
reload_dir = 1;
return;
}
Следующая функция (которая вызывается из основного) выполняется только основным thread:
void
RunServer (arg1, ...)
{
// do some stuffs
...
while (cond != true) {
sleep(1);
}
server_exit();
}
Теперь, когда SIGUSR1 перехватывается (любым потоком, включая основной поток), я устанавливаю переменную reload_dir равной 1. И в RunServer()
я перезагружаю каталог на основе этого значения. Однако я также сбрасываю глобальную переменную reload_dir
на 0, чтобы избежать повторной загрузки каталога бесконечно. И эта установка reload_dir
в 0 приведет к гонке.
Поскольку мы не должны использовать блокировки или мьютекс в обработчике сигналов, как я могу добиться этого без существенного изменения существующего дизайна приложения.
void
RunServer (arg1, ...)
{
// do some stuffs
...
while (cond != true) {
if (reload_dir) {
// reset reload_dir to avoid loading repeatedly indefinitely
reload_dir = 0; // Race condition?
dir_reinit();
}
sleep(1);
}
server_exit();
}