2012-07-12 26 views
13

nếu chức năng gọi bằng pthread_create có cấu trúc sautại sao pthread_exit ném thứ gì đó bị vệt bằng dấu chấm lửng?

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

tại sao xử lý ngoại lệ cho lược được gọi vào việc thực hiện các pthread_exit? (lưu ý rằng std::exception, chẳng hạn, không được ném)

+0

Trình biên dịch nào bạn thấy dưới đây? –

+0

@Fabio Có lẽ một số destructor của một đối tượng trên stack là ném. –

+0

@DaveS g ++ TorstenRobitzki cảm ơn bạn, tôi mặc dù vậy, nhưng trường hợp là một trong những giải thích bởi eran –

Trả lời

22

pthread_exit có thể ném một ngoại lệ ___forced_unwind, được sử dụng để tháo ngăn xếp trong khi thoát khỏi chuỗi. Nó không được kế thừa từ std::exception, và do đó không thể bị phát hiện là một. Nếu bạn làm điều bắt ngoại lệ đó, hãy chắc chắn để tái throw nó để nó có thể làm công việc của mình:

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

Lý do một ngoại lệ được ném là pthread_exit được quy định không bao giờ trở lại. Có nó ném đảm bảo dọn dẹp các biến phân bổ stack, và không thực hiện mã sau khi vị trí của nó (trừ khi bạn bắt được ngoại lệ thư giãn ...).

BTW, đây là trường hợp khác trong đó thành ngữ catch (...) có hại nhiều hơn lợi. Nó đôi khi được sử dụng để "ổn định" mã đó là ném ngoại lệ không xác định. Nhưng điều đó chỉ làm giảm khả năng hiển thị của thiệt hại cho một thời gian và địa điểm sau đó, làm cho nó không thể xác định nguồn gốc thực sự của vấn đề. Điều hợp lý duy nhất để thực hiện trong việc nắm bắt này là dọn dẹp tối thiểu, có thể đăng nhập và sau đó khôi phục lại. Một quá trình bị treo do một ngoại lệ chưa được giải quyết không phải là một cảnh đẹp, nhưng nó có thể cung cấp một bãi chứa sự cố có thể gỡ lỗi hiển thị rõ ràng lệnh bị lỗi. Nhưng đó chỉ là mối hận thù của tôi đối với catch (...), điều này hầu như không liên quan đến pthread_exit ...

+0

Cảm ơn bạn rất nhiều, đây là chính xác trường hợp! và tôi đoán cú ném của bạn là để ngăn chặn FATAL: ngoại lệ không được rethrown cảm ơn bạn! –

+0

+1 Rất thú vị! –

+1

@Fabio: 'abi :: __ forced_unwind exception' cũng có thể được ném vào các chủ đề đã bị hủy với' pthread_cancel'. Hãy cẩn thận với việc đánh dấu elip khi chấm dứt pthreads. –

Các vấn đề liên quan