ustaw flagę w programie obsługi sygnału

W C ++ 11 jaki jest najbezpieczniejszy (i najskuteczniejszy) sposób wykonywania niebezpiecznego kodu na przechwytywanym sygnale, biorąc pod uwagę typ pętli żądania (jako część pętli żądania WWW)? Na przykład przy przechwytywaniu SIGUSR1 z linii poleceń linux:kill -30 <process pid>

Dopuszczalne jest, aby „niebezpieczny kod” był uruchamiany przy następnym uruchomieniu żądania, a żadne informacje nie zostaną utracone, jeśli sygnał zostanie wystrzelony wiele razy przed uruchomieniem niebezpiecznego kodu.

Na przykład mój obecny kod to:

static bool globalFlag = false;

void signalHandler(int sig_num, siginfo_t * info, void * context) {
    globalFlag = true;
}
void doUnsafeThings() {
    // thigns like std::vector push_back, new char[1024], set global vars, etc.
}
void doRegularThings() {
    // read filesystem, read global variables, etc.
}

void main(void) {

    // set up signal handler (for SIGUSR1) ...
    struct sigaction sigact;
    sigact.sa_sigaction = onSyncSignal;
    sigact.sa_flags = SA_RESTART | SA_SIGINFO;
    sigaction(SIGUSR1, &sigact, (struct sigaction *)NULL);

    // main loop ...
    while(acceptMoreRequests()) { // blocks until new request received
        if (globalFlag) {
            globalFlag = false;
            doUnsafeThings();
        }
        doRegularThings();
    }
}

gdzie wiem, że mogą wystąpić problemy z testowaniem głównej pętli + ustawienie boolean globalFlag.

Edytuj: Theif (globalFlag) test zostanie uruchomiony w dość ciasnej pętli, a „okazjonalny” fałszywy negatyw jest akceptowalny. Podejrzewam jednak, że i tak nie ma optymalizacji rozwiązania Basile Starynkevitch?

questionAnswers(1)

yourAnswerToTheQuestion