2013-05-02 13 views
5

Ho scritto una semplice applicazione multithread in C++11 su piattaforma Linux e vorrei terminare il server e le sue thread in esecuzione inviando il segnale SIGINT.Terminazione dell'applicazione multithread in C++ 11 tramite il segnale POSIX

Ovviamente la mia applicazione server utilizza il supporto thread da C++ 11 (std::thread ecc.). Sebbene abbia trovato supporto per la gestione dei segnali in C++ 11 (std::signal), non sono riuscito a trovare alcun supporto per la gestione dei segnali in ambiente multithread.

Quindi la mia domanda è: esiste un modo per gestire i segnali nell'applicazione multithread in C++11 o devo fare affidamento su pthreads solo perché la mia applicazione deve gestire i segnali?

+0

Sembra che tu abbia già la risposta giusta in mano: std :: signal e std :: thread - perché non sono sufficienti? –

+0

Correlati: http://stackoverflow.com/questions/2575106 – pilcrow

risposta

1

2.4 Signal Concepts:

Al momento della generazione, una determinazione è effettuata se il segnale è stato generato per il processo o per uno specifico thread all'interno del processo. I segnali generati da un'azione attribuibile a un determinato thread, ad esempio un errore hardware, devono essere generati per il thread che ha causato la generazione del segnale. I segnali generati in associazione con un ID di processo o un ID del gruppo di processi o un evento asincrono, come l'attività del terminale, devono essere generati per il processo.

...

segnali generati per il processo sono consegnati esattamente uno di quei fili all'interno del processo che è in una chiamata a una funzione sigwait() selezionare il segnale o non ha bloccato la consegna del segnale .

Alla luce di quanto sopra, in un processo multi-thread una soluzione comune è bloccare tutti i segnali che si intende gestire in tutti i thread tranne uno. Quello thread normalmente gestirà tutti i segnali di processo e dirà agli altri thread cosa fare (ad es. Terminerà) ed è spesso il thread principale. È facile bloccare i segnali nel thread principale prima di creare altri thread, che ereditano la maschera di segnale del thread principale. Una volta che il thread principale ha finito di creare thread figli ed è pronto per gestire i segnali, è necessario sbloccarli.

Sfortunatamente, C++ 11 non fornisce alcun mezzo per questo. Devi usare le funzioni POSIX. Scorri verso il basso fino a Segnalazione in un processo multithreading in pthread_sigmask per un esempio che crea uno speciale thread di gestione del segnale. Quest'ultimo non è necessario se si utilizza un ciclo di eventi nel thread principale che può gestire i segnali, basta sbloccare i segnali prima di entrare nel ciclo degli eventi.

+0

Cosa succede se si desidera fare affidamento solo sulle funzioni standard di C++ 11? Potresti impostare un gestore di segnale con std :: signal durante la creazione di thread * senza * bloccare i segnali e semplicemente lasciare che un filo casuale catturi il segnale? Il gestore di segnale dovrebbe essere semplice, avrebbe bisogno del collegamento C e preferibilmente solo accedere a un int volatile. Ma questo sarebbe conforme allo standard C++ 11 e comporterebbe un comportamento ben definito in un ambiente multithread? – JohnCand

+1

@ JohnCaC2 Probabilmente no, i segnali sono in gran parte al di fuori dello scopo dello standard C++. –

+0

Trovo strano che le potenze siano rimaste per ogni maschera di segnale fuori da C++ 11 ma si sono rivolte al resto del threading in std. Impostare correttamente la gestione dei segnali in un'applicazione multithread è una parte cruciale della scrittura di app di classe enterprise. Odora come una soluzione mezza al forno per essere sinceri.Ora sei tornato su libpthread per farlo e finisci con un mix malsano di thread std e thread posix e spero che std usi i pthread per fare la sua parte dietro la scena – Waslap

Problemi correlati