2014-12-09 28 views
7

Tôi đang cố gắng tìm hiểu chính xác điểm hủy trong C++. Tôi đã đọc:Điểm hủy chính xác là gì?

man pageWhat are pthread cancellation points used for

Nhưng tôi vẫn còn một chút nhầm lẫn về điểm nhất định. Ví dụ, tôi đang sử dụng hàm write() của tệp. Rõ ràng đây là một điểm hủy bỏ. Vì vậy, khi tôi gọi write(), tôi có thể thấy rằng một luồng khác có thể bắt đầu xử lý (vì vậy mã của tôi chuyển từ chuỗi ghi sang luồng khác), điều này thường xảy ra khi bộ đệm ghi đầy và cần được làm trống trước khi ghi() có thể thành công/hoàn thành.

Nhưng trong tâm trí của tôi, đây không phải là hủy bỏ một chủ đề, nhưng chỉ đơn thuần là một chặn tạm thời/tạm ngưng, và không có chủ đề "dọn dẹp" để làm ...

Vì vậy, câu hỏi của tôi là, làm hủy điểm có liên quan đến "điểm chặn"? - chúng có thực sự giống nhau không, hoặc có sự khác biệt nào không? Bất kỳ mô tả "cấp cao nhất" nào rõ ràng về điểm hủy sẽ thực sự hữu ích.

+1

Điểm hủy nói chung là bất kỳ điểm nào trong luồng điều khiển nơi điều khiển trả về lịch biểu. Chỉ có thể có nghĩa là "hủy bỏ" là không được lên kế hoạch một lần nữa, vì vậy bạn chỉ có thể hủy bỏ điều gì đó nếu bạn có thể ảnh hưởng đến các quyết định lên lịch. Các cuộc gọi hệ thống tạo thành một tương tác tự nhiên với trình lên lịch, mặc dù có thể có những người khác. –

+0

@KerrekSB Với nhận xét này và câu trả lời của Bogdan V, tôi nghĩ rằng điều này thực sự có ý nghĩa với tôi bây giờ, cảm ơn :) –

+0

Cảm ơn @KerrekSB cho một lời giải thích rõ ràng, ngắn gọn và vững chắc đề cập đến lịch trình. – ifelsemonkey

Trả lời

8

Khi chủ đề của bạn bị kéo khỏi án tử hình, trạng thái của nó được lưu bởi hệ điều hành và đó không phải là một hủy của chuỗi.Việc hủy bỏ có nghĩa là chấm dứt chuỗi, theo yêu cầu, với mục đích cụ thể để cho phép mọi thứ trong trạng thái cuối cùng khi hoàn thành (aka. Tất cả các tài nguyên được giải phóng, tất cả các trình xử lý được cập nhật, v.v.).

Việc bạn chặn cuộc gọi có thể xảy ra với chuỗi trong khi hủy giữa.

Ví dụ: Chuỗi nhận yêu cầu hủy. Hệ điều hành sẽ đợi hàng đợi cho đến khi luồng được hủy. Khi thread bị hủy, và thread đang thực hiện một điểm hủy, thread có thể được làm sạch và hủy bỏ. Chức năng ghi là điểm hủy, điều này có nghĩa là nó được an toàn từ quan điểm của hệ điều hành để hủy bỏ chủ đề trong khi chức năng này được thực hiện (trạng thái của tất cả các tài nguyên liên quan sẽ nhất quán).

Trong khi quy trình hủy đang chạy, chuỗi có thể bị chặn nhiều lần khi hệ điều hành có vẻ phù hợp.

Lưu ý bổ sung, nếu bạn xem xét yêu cầu POSIX cho các điểm hủy, hầu như tất cả các giao diện chặn được yêu cầu phải hủy điểm. Nếu không, trên bất kỳ chủ đề hoàn toàn bị chặn nào (trong cuộc gọi đó), sẽ không có cách nào an toàn để chấm dứt chuỗi đó.

http://man7.org/linux/man-pages/man7/pthreads.7.html

+0

Ahh, điều này có ý nghĩa hơn. Vì vậy, một điểm hủy bỏ thực sự là để hủy bỏ chủ đề, nhưng có một mối quan hệ không trực tiếp đến "chặn điểm" bởi vì, như bạn nói, nếu không bạn có thể nhận được "bế tắc" chủ đề mà bạn thậm chí không thể giết ... Tôi nghĩ điều này trả lời câu hỏi của tôi và xóa bỏ sự nhầm lẫn của tôi :) –

+3

Chủ đề bị khóa chết có thể bị giết bằng pthread_kill. Chuỗi đích sẽ nhận được SIGKILL. Nhưng ví dụ, các destructors của các đối tượng trong thread lưu trữ cục bộ sẽ không được gọi. Ngoài ra, khi bị giết, không có gì đảm bảo rằng các cấu trúc bên trong được sử dụng cho sợi chỉ sẽ được giải phóng. pthread_cancel được dự định là cách "sạch nhất" để thực hiện khi bạn không tham gia. –

+0

Có, điểm tốt, cảm ơn –

5

Khi bạn muốn chấm dứt hoặc hủy bỏ một sợi từ thread khác (ví dụ, các chủ đề chính) sử dụng pthread_cancel() sau xảy ra (c.f.):

Chức năng pthread_cancel() gửi một yêu cầu hủy bỏ cho các thread .

Các chủ đề mục tiêu sẽ không chấm dứt ngay lập tức, mà đúng hơn là khi nó đạt đến một điểm hủy (c.f.):

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ể , là điểm hủy. Nếu một chuỗi có thể hủy, loại hủy của nó sẽ bị trì hoãn và yêu cầu hủy là đang chờ xử lý, sau đó thì chủ đề bị hủy khi nó gọi hàm là điểm hủy.

Có hay không những chức năng này là điểm hủy cũng có thể chặn thực hiện chuỗi, không liên quan tại thời điểm này. Có một danh sách các chức năng này trong tài liệu:

Lưu ý rằng có những cài đặt có thể ảnh hưởng đến hành vi và "cancellability" của một thread mà tôi đã bỏ ra ở đây vì đơn giản. Để đọc thêm:

+0

Cảm ơn tất cả các liên kết, tôi đã đọc qua hầu hết những điều này, tôi nghĩ nguồn gốc của sự nhầm lẫn của tôi là vì tôi nghĩ điểm "chặn" giống như điểm hủy bỏ mà các câu trả lời khác đã xóa cho tôi. Tuy nhiên, +1 cho tất cả thông tin :) –