2011-09-06 18 views
15

ho bloccando compito che sarà assicurato dalla funzione find_the_question(). Tuttavia, non voglio che thread che esegue questa funzione impieghi più di 10 secondi. Quindi nel caso occorrano più di 10 secondi, voglio chiudere quel thread con la pulizia di tutte le risorse.Boost Discussione - Come riconoscere interrompere

ho cercato di scrivere un codice per questo, ma in qualche modo non sono in grado di ottenere un interrupt find_the_question funzione() se filo impiega più di 10 secondi. Potresti dirmi cosa sto sbagliando?

void find_the_question(std::string value) 
{ 
    //allocate x resources 
    try{ 
     //do some process on resources 
      sleep(14); 
     //clean resources 
    } 
    catch(boost::thread_interrupted const&) 
    { 
     //clean resources 
     std::cout << "Worker thread interrupted" << std::endl; 
    } 
} 

int main() 
{ 
     boost::posix_time::time_duration timeout = boost::posix_time::milliseconds(10000); 
     std::cout << "In main" << std::endl; 
     boost::thread t1(find_the_question, "Can you block me"); 

     t1.interrupt(); 
     if (t1.timed_join(timeout)) 
     { 
      //finished 
      std::cout << "Worker thread finished" << std::endl; 
     } 
     else 
     { 
      //Not finished; 
      std::cout << "Worker thread not finished" << std::endl; 
     } 

     std::cout << "In main end" << std::endl; 
} 

uscita: Se t1 richiede più di 10 secondi per completare, io sono sempre a seguito dell'uscita della console.

std::cout << "In main" << std::endl; 
std::cout << "Worker thread not finished" << std::endl; 
std::cout << "In main end" << std::endl; 

mentre, mi aspetto seguente output

std::cout << "In main" << std::endl; 
std::cout << "Worker thread interrupted" << std::endl; 
std::cout << "Worker thread not finished" << std::endl; 
std::cout << "In main end" << std::endl; 

La prego di dirmi che cosa sto facendo di sbagliato.

Grazie in anticipo

+5

"sleep (14);" che stai utilizzando. È un sonno da 'boost :: thread' o è la funzione c sleep? Perché l'interrupt funziona solo su 'boost :: thread: sleep' – mkaes

risposta

25

Per usare il boost :: :: filo interrupt(), si devono usare boost :: :: filo sleep() per farlo funzionare.

Un filo conduttore può essere interrotto richiamando l'allarme() membro funzione dell'oggetto boost :: corrispondente filettatura. Quando il thread interrotto esegue una delle interruzioni specificate punti (o se è attualmente bloccato durante l'esecuzione di uno) con l'interruzione abilitata, quindi un'eccezione boost :: thread_interrupted sarà essere generata nel thread interrotto. Se non rilevato, ciò causerà l'esecuzione del thread interrotto per terminare. Come con qualsiasi altro eccezione, lo stack verrà sciolta e distruttori per oggetti di durata memorizzazione automatica viene eseguita

punti di interruzione predefiniti:

Le seguenti funzioni sono punti di interruzione, che sarà gettare boost :: thread_interrupted se l'interruzione è abilitato per la corrente filo, e l'interruzione viene richiesta per il thread corrente:

boost::thread::join() 
boost::thread::timed_join() 
boost::condition_variable::wait() 
boost::condition_variable::timed_wait() 
boost::condition_variable_any::wait() 
boost::condition_variable_any::timed_wait() 
boost::thread::sleep() 
boost::this_thread::sleep() 
boost::this_thread::interruption_point() 
Problemi correlati