Điểm hủy có cho phép các cuộc gọi API cụ thể đó bị hủy không?
Gắn bó với PTHREAD_CANCEL_DEFERRED, đây có thể là trung tâm của sự nhầm lẫn. Bạn gần như đang nghĩ về nó về phía sau. Điểm hủy không cho phép cuộc gọi hệ thống (API trong danh pháp của bạn) bị hủy, cuộc gọi sẽ kiểm tra xem yêu cầu hủy đang chờ xử lý hay chưa. Về mặt khái niệm, bạn có thể nghĩ về điều này là (thủ công) thiết lập một công tắc. Các điểm hủy tự động sẽ kiểm tra xem nó có hiệu lực hay không và một cuộc gọi có chủ ý tới pthread_testcancel
có thể được chèn vào nơi thuận tiện hoặc cần thiết - ví dụ, ở giữa vòng lặp tính toán dài, nơi có thể không thể hủy cuộc gọi hệ thống. Các điểm hủy tự động thực hiện các cuộc gọi đến bất kỳ trình xử lý dọn dẹp pthread nào đã được thiết lập và có thể bị xích theo cách tương tự như các cuộc gọi atexit
.
Rất nhiều người chọn (nếu hoàn toàn khả thi cho tình huống của họ) để đặt công tắc và mã riêng của họ một cách tắt luồng tại điểm đó trong chuỗi khi họ kiểm tra công tắc. PTHREAD_CANCEL_DEFERRED về cơ bản là trên steroid. Nó cung cấp (tiềm năng) một số điểm mà chuyển đổi đó là kiểm tra khái niệm và do đó cũng buộc các nhà phát triển phải xem xét các tác động của việc bị hủy bỏ tại mỗi một trong những điểm đó.
Tại sao những người này và không phải người khác?
Bạn cần thảo luận về cuộc gọi này bằng cơ sở cuộc gọi nhưng chủ yếu là do tác dụng phụ không thể đoán trước.
Bạn có muốn sử dụng các điểm hủy trong mã cấp người dùng hoặc chỉ trong API không?
Có, bạn muốn sử dụng chúng trong mã cấp người dùng. Bạn là lập trình viên ở vị trí tốt nhất để biết bạn đang sử dụng tài nguyên nào và làm thế nào để dọn sạch chúng nếu chuỗi bị hủy và các hàm ý hợp lý của việc hủy bỏ tại bất kỳ điểm đã cho nào.
PTHREAD_CANCEL_ASYNCHRONOUS là một quả bóng khác của sáp và cơn ác mộng của riêng nó. Về mặt khái niệm, bạn gần như có thể nghĩ về điều này khi thread bị thổi bay bởi tín hiệu kill
- nó có thể bị gián đoạn ở bất cứ đâu - nhưng nó cung cấp cơ hội cho các trình xử lý dọn dẹp chạy. Vấn đề là rất khó để thực hiện điều đó, v.d. điều gì xảy ra nếu nó bị hủy ở giữa một số malloc
? Điều này làm cho nó khá vô dụng bên ngoài một số tình huống thực sự, thực sự, được xem xét cẩn thận.
Tài liệu bạn liên kết trả lời cho câu hỏi của bạn, ít nhất với liên kết này: http://man7.org/linux/man-pages/man7/pthreads.7.html (xem * Điểm hủy *) – alk
Tài liệu nói rằng các chức năng đó phải là Điểm hủy, nhưng nó không nói những gì chúng được sử dụng cho hoặc những gì chúng làm. – vy32
Xem liên kết tôi đã liên kết từ những gì bạn đã liên kết trong nhận xét của tôi ở trên. – alk