Tôi đang làm việc trên thư viện nơi tôi đang triển khai nhiều tác vụ khác nhau cho một số thư viện của bên thứ ba. (Cụ thể, tôi đang viết một trình phân tích hàm toán học gọi các trình biên dịch JIT, như LLVM hoặc libjit, để xây dựng mã máy.) Trong thực tế, các thư viện của bên thứ ba này có xu hướng bị lỗi (một phần của đây là lỗi của tôi) , tất nhiên, nhưng tôi vẫn muốn một số bảo hiểm).Làm cách nào để cách nhiệt một công việc/chủ đề từ các sự cố
Tôi muốn, sau đó, để có thể rất duyên dáng đối phó với một công việc chết khủng khiếp - SIGSEGV, SIGILL, v.v. - mà không mang xuống phần còn lại của mã của tôi (hoặc mã của người sử dụng gọi điện thoại của tôi chức năng thư viện). Để rõ ràng, tôi không quan tâm nếu công việc cụ thể đó có thể tiếp tục (tôi sẽ không cố gắng sửa chữa một tình trạng tai nạn), tôi cũng không quan tâm đến trạng thái của các đối tượng sau vụ tai nạn đó (tôi sẽ hủy bỏ chúng ngay lập tức nếu có sự cố). Tôi chỉ muốn có thể phát hiện thấy một vụ tai nạn đã xảy ra, dừng vụ tai nạn từ việc loại bỏ toàn bộ quá trình, ngừng gọi bất kỳ sự cố nào xảy ra và tiếp tục thực hiện.
(Đối với một ít ngữ cảnh hơn, mã tại thời điểm này là vòng lặp for, kiểm tra từng trình biên dịch JIT có sẵn. Một số trình biên dịch này có thể bị lỗi. Nếu có, tôi chỉ muốn thực thi continue;
và tiếp tục với thử nghiệm một trình biên dịch khác.)
Hiện tại, tôi đã thực hiện dựa trên signal()
không thành công lắm; tất nhiên, đó là hành vi không xác định đối với longjmp()
trong bộ xử lý tín hiệu và các trình xử lý tín hiệu được dự kiến sẽ kết thúc với exit()
hoặc terminate()
. Chỉ cần ném mã trong một chủ đề khác không giúp đỡ chính nó, ít nhất là cách tôi đã thử nghiệm nó cho đến nay. Tôi cũng không thể hack ra một cách để làm cho công việc này bằng cách sử dụng ngoại lệ C++.
Vì vậy, cách tốt nhất để cách nhiệt một tập hợp lệnh/chuỗi/công việc cụ thể khỏi sự cố là gì?
Đây là cách duy nhất để làm điều đó. Một luồng có thể làm hỏng bộ nhớ ở bất kỳ nơi nào trong tiến trình, vì vậy sau SEGV, bạn không thể đảm bảo rằng bộ nhớ của bạn không bị ảnh hưởng. – KeithB
Cảm ơn bạn đã trưởng thành. Gần như chắc chắn là câu trả lời đúng ở đây. Tôi đi đọc trên fork() và công ty. –