establecer bandera en el manejador de señal

En C ++ 11, ¿cuál es la forma más segura (y perceptiblemente más eficiente) de ejecutar código inseguro en una señal que se detecta, dado un tipo de bucle de solicitud (como parte de un bucle de solicitud web)? Por ejemplo, al capturar un SIGUSR1 desde una línea de comando de linux:kill -30 <process pid>

Es aceptable que el 'código inseguro' se ejecute en la siguiente solicitud que se está disparando, y no se pierde información si la señal se dispara varias veces antes de que se ejecute el código inseguro.

Por ejemplo, mi código actual es:

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();
    }
}

donde sé que podría haber problemas en la prueba de bucle principal + configuración del booleano globalFlag.

Editar: Elif (globalFlag) la prueba se ejecutará en un ciclo bastante cerrado, y se acepta un falso negativo "ocasional". Sin embargo, ¿sospecho que no hay optimización sobre la solución de Basile Starynkevitch de todos modos?

Respuestas a la pregunta(1)

Su respuesta a la pregunta