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?
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
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
Đúng, đó là cách bạn sử dụng hủy. –