Sto cercando di terminare correttamente la mia applicazione C++ 11 multi-threaded alla ricezione del segnale SIGINT (^C
è), ma per qualche motivo non si propaga ai thread figlio , anche se il thread principale risponde bene.Segnale di propagazione (SIGINT) a C++ 11 thread
Per instnce (come nell'esempio di codice di seguito), se abbiamo una qualche funzione di blocco all'interno di filo (come sleep()
), ci vorranno tutte ^C
controllo da te se installato alcun hook signt utilizzando, per esempio, sigaction()
funzione .
C'è un modo per risolvere o aggirare questo comportamento? C'è un modo per propagare i segnali ricevuti principali ai thread figli?
EDIT: sostituito POSIX sleep()
con C++ 11 std::this_thread::sleep_for()
#include <iostream>
#include <thread>
#include <chrono>
#include <signal.h> // for sigaction() function
static int signaled = 0;
void threaded_foo() {
while (!signaled) {
// pressing ^C now will not lead to correct termination, because we are
// sleeping for a long time (100500 seconds) and do not respond to
// SIGINT for some tricky reason i am looking a bypassage for.
std::chrono::seconds duration(100500);
std::this_thread::sleep_for(duration);
}
std::cout << "Correct termination\n";
}
void sighandler(int sig, siginfo_t *siginfo, void *context) {
signaled = 1;
}
void install_sig_hooks() {
struct sigaction action;
memset(&action, 0, sizeof(struct sigaction));
action.sa_sigaction = sighandler;
action.sa_flags = SA_SIGINFO;
sigaction(SIGINT, &action, NULL);
}
int main(int argc, char **argv) {
install_sig_hooks();
std::thread t(threaded_foo);
t.join();
return 0;
}
EDIT2 Quindi la soluzione era di sostituire tutte le chiamate di blocco con controparti non-blocking e meccanismi come variabili di condizione e polling .
La domanda rimane senza risposta reale come software corrente (e, possibilmente, hardware) non è progettato in modo di gestire segnali più quindi in un thread, che si suppone uno a dire agli altri cosa fare dopo aver ricevuto segnali.
Perché sei mescolando i POSIX 'sleep' funzione con i thread C++ 11? –
Solo a titolo di esempio, nella vera applicazione è la funzione Send() di ZeroMQ con esattamente lo stesso effetto. –
beh, in effetti, è un cattivo esempio, avrei dovuto usare 'std :: this_thread :: sleep_for()' invece. Mi dispiace, lascia che corregga il mio esempio. –