2012-10-17 10 views
5

Ho diverse funzioni di lavoro, che richiamano funzioni accessorie che potrebbero avere qualcosa di brutto. Voglio essere in grado di interrompere le funzioni di lavoro se una funzione accessoria determina che qualcosa di brutto è successo, senza inserire numerosi controlli di flag nelle funzioni di lavoro. Ad esempio,Metodo di uccisione C++ senza controllare costantemente le flag

struct Worker { 
    bool badhappened = false; 
    Worker() { 
     std::thread([&]() { 
      while (not badhappened); 
      // kill the work 
     }).detach(); 
    } 
    int WorkComponent { 
     if (badhappening()) 
      badhappened = true; 
     return someint; 
    } 
    void DoWork { 
     // WorkComponents called several times 
    } 
} 

Ma io non so come chiamarla a kill the work. Non è un problema che lo DoWork si verifichi in un thread separato, ma non sembra essere un equivalente pthread_kill nei thread di C++. Esiste una soluzione che non implichi l'inserimento di più chiamate if(badhappened) return; in DoWork?

+3

Si potrebbe utilizzare le discussioni Boost, invece, in quanto hanno punti terminali che possono essere controllati (che non è molto diverso da quello controllando una variabile ammetto). Tuttavia, uccidere forzatamente un thread potrebbe essere negativo, specialmente se il thread ha assegnato risorse. –

+0

Aumentare un'eccezione? –

+0

@JoachimPileborg 'pthread_kill', per quanto ne so, può inviare un segnale di terminazione simile a quello che fa 'kill'. Immagino che ci sia un meccanismo simile in 'std :: thread', ma non so cosa sia. @MartinJames Che potrebbe funzionare in realtà, non dovrebbe accadere abbastanza spesso per essere un colpo notevole delle prestazioni. Buona idea, grazie! –

risposta

6

Lunga storia breve:

Non esiste un modo sicuro per fermare un thread non cooperativo.

Sì, ci sono strumenti per chiudere forzatamente un thread ma si sta cercando un problema. L'unico modo sicuro è concordare una politica di risoluzione. Questo si riduce a controllare una bandiera abbastanza frequentemente mentre scrivi.

Maggiori informazioni su questo da guru:

C++ and Beyond 2011: Scott, Andrei and Herb - Ask Us Anything

Vedi a 30:44 Qual è il problema con terminazione filo sistematica e di principio e la cessazione del programma?


Annullamento di un thread non è una buona idea in POSIX sia:

Cancelling a thread using pthread_cancel : good practice or bad

Problemi correlati