Như đã nêu trong http://en.cppreference.com/w/cpp/error/terminate có nhiều lý do để gọi chấm dứt. Tôi có thể tưởng tượng trường hợp mà chỉ gần như trong cùng một thời gian một số trong những lý do này xảy ra trong hai chủ đề.Người dùng phải cung cấp chức năng chấm dứt() có an toàn không?
Q1 Chức năng chấm dứt được đặt bởi std::set_terminate
được gọi hai lần trở lên cùng một lúc, đồng thời tôi có nghĩa là cuộc gọi thứ hai bắt đầu trước khi kết thúc lần đầu tiên.
Thread1 Thread2
| |
_ |
t |
e |
r |
m |
i _
n t
a e
t r
e m
- ?
Q2 Nếu Q1 == YES, sau đó điều gì sẽ xảy ra nếu đầu tiên chấm dứt kết thúc. Tôi đoán nếu nó đã kết thúc với std :: hủy bỏ, sau đó chương trình kết thúc, nhưng những gì sẽ xảy ra nếu người dùng cung cấp chấm dứt không hủy bỏ chương trình?
Q3 Chức năng chấm dứt được đặt bởi std::set_terminate
có được gọi trong ngữ cảnh của chuỗi gây ra cuộc gọi kết thúc này không?
+1.Chỉ để trả lời câu hỏi trong chủ đề: người dùng cung cấp chức năng chấm dứt phải là chủ đề an toàn? Còn về các chức năng "thiên tai" khác? Thế còn new_handler thì sao? Lời khuyên về gcc này có nguy hiểm không bị xóa kép: http://gcc.gnu.org/onlinedocs/libstdc++/manual/dynamic_memory.html? – PiotrNycz
Vì 'std :: terminate' có thể được gọi đồng thời,' terminate_handler' nên là luồng an toàn. Và điều này cũng đúng với tất cả các trình xử lý khác được chỉ định trong tiêu chuẩn, bao gồm 'new_handler'. Có, ví dụ về gcc có nguy cơ thực hiện thao tác xóa kép. Điều này có thể được giải quyết với một trao đổi nguyên tử về 'an toàn'. –
"chức năng thiết lập bởi std :: set_terminate là một toàn cầu" - Tại sao? Một số triển khai nói rằng nó là cục bộ ([ms: các hàm kết thúc được duy trì riêng cho mỗi luồng] (http://msdn.microsoft.com/en-us/library/aa272914 (v = vs.60) .aspx); [ibm : Bạn thể ghi đè lên điều này với một chấm dứt chủ đề cấp] (http://publib.boulder.ibm.com/infocenter/zos/v1r11/index.jsp?topic=/com.ibm.zos.r11.bpxbd00/setterm. htm); [sun: thread có thể tự thiết lập] (http://www.amath.unc.edu/sysadmin/DOC4.0/c-plusplus/c%2B%2B_ug/Exception_Handling.doc.html)) Can ' t tìm định nghĩa chính xác trong tiêu chuẩn.http: //stackoverflow.com/q/15367060/196561 – osgx