2014-04-22 11 views
7

Có thảo luận về các điểm hủy bỏ pthread (http://man7.org/linux/man-pages/man3/pthread_cancel.3.html) về một số câu hỏi. Trong một số trường hợp, người trả lời nói rằng không nên sử dụng các điểm hủy trừ khi người lập trình biết họ đang làm gì rất tốt.Điểm hủy pthread được sử dụng để làm gì?

Câu hỏi của tôi --- điểm hủy trên pthread được sử dụng để làm gì?

[cập nhật từ bình luận]

  1. Liệu một điểm hủy cho phép những API cụ thể các cuộc gọi đến bị hủy bỏ?
  2. Tại sao những người đó và không phải là những người khác?
  3. Có ai muốn sử dụng chúng cho bất kỳ điều gì khác không?
  4. Có phải chúng là một hack để đối phó với một vấn đề trong hạt nhân, hoặc chúng vốn có trong một cái gì đó phải có với POSIX?
  5. Bạn có muốn sử dụng các điểm hủy trong mã cấp người dùng hay chỉ trong API?
+0

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

+0

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

+0

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

Trả lời

3

Đ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.

+1

Chỉ cần nhấn mạnh điểm cuối cùng của bạn: a thread trong chế độ PTHREAD_CANCEL_ASYNCHRONOUS khiêu khích hành vi undefined nếu nó gọi * bất kỳ chức năng thư viện chuẩn * khác hơn 'pthread_setcancelstate',' pthread_setcanceltype', hoặc 'pthread_cancel'. – zwol

+1

Đây là mô tả bằng tiếng Anh đơn giản nhất mà tôi đã đọc. Nếu bạn có thể mở rộng một chút và nó có thể là một trợ giúp tuyệt vời cho mọi người. –

3

... điểm hủy trên pthread được sử dụng để làm gì?

Từ man 7 pthreads:

điểm Hủy

POSIX.1 xác định rằng chức năng nhất định phải, và một số chức năng khác có thể, hãy điểm hủy.

thêm:

Nếu một thread có thể hủy bỏ, loại cancelability được trì hoãn, và yêu cầu hủy là cấp phát các chủ đề, sau đó các chủ đề bị hủy khi nó gọi một hàm rằng là một điểm hủy bỏ.

Nhắc các câu hỏi:

  1. Các chức năng API được định nghĩa bởi POSIX đây: http://man7.org/linux/man-pages/man7/pthreads.7.html (Hủy điểm) hoặc hủy điểm hoặc có thể số.
  2. Để giới thiệu cuộc gọi điểm hủy cụ thể (người dùng) pthread_testcancel() nơi bạn cảm thấy cần thiết.
  3. số
  4. Chúng được xác định bởi POSIX để cung cấp cách chuẩn hóa để xử lý cách hủy có thể xảy ra. Điều này đặc biệt có ý nghĩa đối với chức năng chặn.
  5. thấy 2.

Là một lưu ý cuối cùng: Tránh hủy bỏ đề bất cứ nơi nào có thể, vì nó có thể dẫn đến hành vi bất ngờ và unreproducable của một chương trình.Cố gắng luôn thiết kế một chương trình để có thể tắt nó một cách duyên dáng bằng cách kết thúc tất cả các chủ đề mà không cần gọi rõ ràng pthread_cancel().

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