2012-07-12 24 views
13
pthread_create tarafından çağrılan işlev neden üç nokta için istisna işleyicisi pthread_exit yürütülmesi de denilen olsun mu şu yapıyı

pthread_exit neden elips tarafından yakalanmış bir şey atıyor?

try{ 
    ...code.... 
    pthread_detach(pthread_self()); 
    pthread_exit(NULL); 
}catch(...){ 
    std::cout<<"I am here"<<std::endl; 
} 

varsa

?

+0

ile ilgili olan catch (...)'a karşı kinim bu altında ne görüyorsunuz? –

+0

@Fabio Belki yığınındaki bir nesnenin bazı yıkıcıları fırlatır. –

+0

@DaveS g ++ TorstenRobitzki teşekkür ederim, ben de aynısını yaptım ama durum eran tarafından açıklanmıştı –

cevap

22

pthread_exit bir ___forced_unwind istisna olabilir (std::exception Örneğin, atılan edilmemektedir), bu iş parçacığı çıkışı sırasında yığınını dinlenmek için kullanılır. std::exception'dan miras almaz ve bu nedenle tek olarak yakalanamaz. bir istisnası atılır

try { 
... 
} catch (abi::___forced_unwind&) { 
    throw; 
} catch (...) { 
    // whatever 
} 

nedeni pthread_exit dönmemek üzere belirlenmiş olması: O durum yakalamak yaparsanız onun işini yapabilir, böylece throw onu yeniden emin olun. Atmak, yığın-tahsis edilmiş değişkenlerin temizlenmesini ve yerini sonradan kodun yürütülmesini garanti etmez (gevşeme istisnasını yakalamadıkça ...).

BTW, bu, catch (...) deyiminin, iyi olandan daha fazla zarar verdiği başka bir durumdur. Bazen bilinmeyen istisnalar atan kod "stabilize" için kullanılır. Ancak bu, sadece hasarın görünürlüğünü daha sonraki bir zamana ve yere indirgemekte, bu da sorunun gerçek kaynağını tanımlamayı imkânsız kılmaktadır. Böyle bir yakalamada yapılabilecek tek mantıklı şey, muhtemelen günlükleri temizleyen ve daha sonra yeniden serpiştiren minimal temizlemedir. İşlenmeyen bir istisna nedeniyle çökmekte olan bir işlem oldukça hoş görünmez, ancak hatalı komutu açıkça gösteren bir hata ayıklama kilitlenme dökümü sağlayabilir. Ama bu sadece pthread_exit ...

+0

Çok teşekkür ederim, bu tam da buydu! ve sanırım atmanız FATAL'ı önlemek içindir: istisna yeniden değil teşekkürler! –

+0

+1 Çok ilginç! –

+1

@Fabio: 'pyread_cancel' ile iptal edilen iş parçacıklarında' abi :: __ forced_unwind exception' da atılabilir. Pthreads sonlandırırken, eliptik yaka dikkat edin. –