Khi chương trình UNIX/C của chúng tôi cần thoát khẩn cấp, chúng tôi sử dụng chức năng thoát (3) và cài đặt bộ xử lý ngoại tuyến (3) để làm sạch khẩn cấp. Cách tiếp cận này làm việc tốt cho đến khi ứng dụng của chúng ta nhận được luồng, tại điểm xử lý atexit() dừng lại để làm việc có thể dự đoán được.Tiêu chuẩn POSIX nói gì về ngăn xếp luồng trong bộ xử lý atexit()? Thực hành hệ điều hành là gì?
Chúng tôi đã học bằng cách dùng thử một lỗi rằng các chuỗi có thể đã chết trong trình xử lý atexit() và ngăn xếp của chúng được phân bổ lại.
Tôi không tìm thấy báo giá trong chuỗi biến mất liên kết tiêu chuẩn với atexit(): chủ đề không còn tồn tại sau khi trả về từ main(), nhưng trước khi gọi atexit() hoặc sau? Thực hành thực tế trên Linux, FreeBSD và Mac là gì?
Có mô hình tốt để dọn dẹp khẩn cấp trong chương trình đa luồng không?
Tôi nghĩ trường hợp sử dụng này nên được ghi chú trong ủy ban POSIX/ISO để thảo luận. Điều đó nói rằng, tôi đồng ý rằng bạn không bao giờ * muốn * ở một nơi mà bạn đang ở trong một tiểu bang nơi bạn cần dọn dẹp, nhưng tôi đã thấy mình ở một nơi như vậy một hoặc hai lần - gần đây nhất nếu tôi tuân thủ TAP mã kiểm tra đơn vị/hồi quy tăng một ngoại lệ, sau đó tôi hoặc không nhận được thông báo đầu ra, hoặc tôi phải xử lý atexit. Không có một định nghĩa nghiêm ngặt về ngoại lệ trong trường hợp đa luồng có thể có vấn đề. – EBo