2011-09-06 24 views
15

Find_the_question() işlevi tarafından gerçekleştirilecek engelleme görevim var. Ancak, bu işlevi yürüten iş parçacığının 10 saniyeden uzun sürmesini istemiyorum. Yani 10 saniyeden fazla sürmesi durumunda, tüm kaynakları temizleyerek bu iş parçacığı kapatmak istiyorum.Boost İş Parçacığı - Interrupt nasıl bildirilir

Bunun için bir kod yazmayı denedim, ancak iş parçacığı 10 saniyeden uzun sürerse, find_the_question() işlevinde bir kesme yapamayacağım. Lütfen bana neyi yanlış yaptığımı söyler misiniz?

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

Çıktı: t1 tamamlamak için 10 saniyeden fazla sürer , ben konsol çıkışı aşağıdaki alıyorum.

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

oysa, sana yanlış yapıyorum söyleyebilir misiniz çıkışı

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; 

aşağıdaki bekliyorum. boost :: iplik :: kesme() kullanmak için önceden

+5

Kullandığınız uyku (14); ''. Bu, boost :: thread' den bir uyku mı yoksa c uyku fonksiyonu mu? Çünkü kesme sadece “boost :: thread: sleep' üzerinde çalışır. – mkaes

cevap

25

yılında

sayesinde, o iş için boost :: iplik :: uyku() kullanmak zorunda.

bir çalışan iplik

karşılık gelen bir destek :: iplik nesnesinin kesme() eleman fonksiyonu çağıran ile kesintiye uğratılmış olabilir. kesintili iş parçacığı sonraki noktalarında belirtilen bir kesintiyi kesinti etkinken yürütürse, bu durumda kesintili bir iş parçacığına bir destek :: thread_interrupted istisnası atılır. Eğer yakalanmazsa, bu durum 'un sona erdirilmesi için kesintiye uğramış ipliğin çalıştırılmasına neden olur. herhangi diğer özel durum olduğu gibi, yığın çözülür olacak ve otomatik depolama süresi nesneler için yıkıcı

yürütülür

Önceden belirlenmiş bir kesinti noktası:

aşağıdaki işlevleri olan olur, kesinti noktaları kesinti akımı parçacığı etkin olup olmadığını thread_interrupted :: destek atmak ve kesinti Şu anki işlem için talep edilmektedir:

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() 
İlgili konular