2012-01-29 27 views
5

Trong ứng dụng của tôi, luồng chính tạo hai chuỗi đã nối; một trong đó chờ đầu vào của người dùng bằng cách gọi scanf() trong một vòng lặp và một cái khác lắng nghe các kết nối socket đến bằng cách gọi phương thức accept() trong một vòng lặp. Các kết nối mới được xử lý trong các luồng riêng biệt được tách ra.Làm gián đoạn hai ngăn chặn pthread bằng các tín hiệu

Tôi muốn chương trình tự tắt chính nó khi nhận được tín hiệu SIGINT. Điều đó có nghĩa rằng các thread nghe nên ngừng chấp nhận các kết nối mới, chờ đợi cho các chủ đề hiện đang phục vụ các kết nối để đóng và sau đó sau đó. Chủ đề chờ đầu vào của người dùng cũng sẽ kết thúc và do đó cho phép chủ đề chính kết thúc.

Quétf() và chấp nhận() cả hai khối nhưng có thể bị gián đoạn bởi tín hiệu, tuy nhiên tín hiệu được gửi tới quy trình chỉ có thể được xử lý bởi một chuỗi (AFAIK). Ý tưởng của tôi là để chặn tín hiệu SIGINT trong tất cả các chủ đề ngoại trừ chủ đề chính mà sẽ chờ đợi cho nó. Khi nó nhận được SIGINT, sau đó nó sẽ gửi SIGUSR1 đến hai luồng (một khối được chặn trên scanf() và một khối chặn trên accept()) và sau đó tham gia vào các luồng này.

Đây có phải là giải pháp tốt không? Có cách nào tốt hơn hoặc có lẽ là tiêu chuẩn để đạt được điều này?

Trả lời

5

Giải pháp kinh điển cho các vấn đề như thế này là Thread Cancellation. Yêu cầu hủy đến trong khi một chuỗi bị chặn trong một chức năng mà điểm hủy sẽ được thực hiện ngay lập tức; nếu không, nó sẽ được thực hiện vào lần tới khi chuỗi gọi một hàm là điểm hủy.

Điều duy nhất có thể gây đau đớn khi sử dụng hủy là nó được xây dựng trên một mô hình xử lý ngoại lệ hơn là trả về lỗi. Bạn cần phải giữ hoặc hủy bỏ hầu hết thời gian (và chỉ kích hoạt nó trong quá trình hoạt động mà bạn muốn xử lý hủy) hoặc cài đặt trình xử lý xóa khác (về cơ bản, các trình xử lý ngoại lệ bán xấu trong C) ở mỗi mức khung cuộc gọi nơi bạn có thể có trạng thái trung gian/phân bổ/v.v. để xóa khi chuỗi của bạn bị hủy. Cá nhân tôi thích cách tiếp cận đầu tiên, thường chỉ yêu cầu một trình xử lý hủy được cài đặt.

Mọi cách tiếp cận dựa trên các tín hiệu gián đoạn vốn có điều kiện chủng tộc. Nếu tín hiệu được gửi ngay trước khi chức năng chặn được gọi, khi bộ xử lý tín hiệu trả về, chức năng chặn sẽ được gọi và sẽ chặn vô thời hạn (vì kiểm tra "đã đến lúc thoát chưa?" Đã được chuyển thành công).

+0

Cảm ơn - Tôi đã bí mật hy vọng bạn sẽ trả lời câu hỏi này! Vấn đề là, khi một thread bị hủy bỏ, ví dụ khi chặn trên accept(), bất kỳ logic nào theo sau nó sẽ không được chạy. Tôi cần các chủ đề để chờ đợi cho các chủ đề tách ra được xử lý các kết nối và sau đó các nguồn tài nguyên miễn phí trước khi nó thoát. Làm thế nào tôi có thể đạt được điều này? – SlappyTheFish

+0

ah, là pthread_cleanup_push() những gì bạn có nghĩa là bởi xử lý dọn dẹp? Có vẻ như nó sẽ làm trò lừa. – SlappyTheFish

+0

Đúng, đó là cách bạn sử dụng hủy. –

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