2013-05-02 19 views
5

Tôi đã viết một ứng dụng đa luồng đơn giản trong C++11 trên nền tảng Linux và tôi muốn chấm dứt máy chủ và chủ đề đang chạy bằng cách gửi tín hiệu SIGINT.Chấm dứt ứng dụng đa luồng trong C++ 11 bằng tín hiệu POSIX

Rõ ràng ứng dụng máy chủ của tôi sử dụng hỗ trợ luồng từ C++ 11 (std::thread, v.v.). Mặc dù tôi đã tìm thấy một số hỗ trợ xử lý tín hiệu trong C++ 11 (std::signal), tôi không thể tìm thấy bất kỳ hỗ trợ nào để xử lý tín hiệu trong môi trường đa luồng. Vì vậy, câu hỏi của tôi là - có cách nào để xử lý tín hiệu trong ứng dụng đa luồng trong C++11 hoặc tôi có phải dựa lưng vào pthreads chỉ vì ứng dụng của tôi cần xử lý tín hiệu không? Không.

+0

Có vẻ như bạn có câu trả lời ngay trong tay: std :: signal and std :: thread - tại sao những thứ này không đủ? –

+0

Liên quan: http://stackoverflow.com/questions/2575106 – pilcrow

Trả lời

1

2.4 Signal Concepts:

Tại thời điểm phát sinh, một quyết tâm được thực hiện cho dù các tín hiệu đã được tạo ra cho quá trình này hoặc cho một chủ đề cụ thể trong quá trình này. Các tín hiệu được tạo ra bởi một số hành động có thể quy cho một chuỗi cụ thể, chẳng hạn như lỗi phần cứng, sẽ được tạo ra cho luồng gây ra tín hiệu được tạo ra. Các tín hiệu được tạo kết hợp với ID tiến trình hoặc ID nhóm tiến trình hoặc sự kiện không đồng bộ, chẳng hạn như hoạt động đầu cuối, sẽ được tạo cho quá trình này.

...

Tín hiệu được tạo ra cho quá trình này sẽ được chuyển giao cho chính xác một trong những chủ đề trong quá trình đó là trong một cuộc gọi đến một sigwait() chức năng lựa chọn tín hiệu đó hoặc đã không bị chặn giao của tín hiệu .

Trong ánh sáng ở trên, trong một quy trình đa luồng, một giải pháp phổ biến là chặn tất cả các tín hiệu dự định xử lý trong tất cả các luồng nhưng một. Một chuỗi đó thường xử lý tất cả các tín hiệu của quá trình và cho các luồng khác biết phải làm gì (ví dụ: chấm dứt) và thường là luồng chính. Thật dễ dàng để chặn các tín hiệu trong chuỗi chính trước khi tạo các luồng khác, thừa hưởng mặt nạ tín hiệu của chuỗi chủ đề. Một khi các chủ đề chính được thực hiện tạo chủ đề con và đã sẵn sàng để xử lý tín hiệu, nó phải bỏ chặn những người.

Thật không may, C++ 11 không cung cấp bất kỳ phương tiện nào cho điều đó. Bạn phải sử dụng các chức năng POSIX. Cuộn xuống Báo hiệu trong Quy trình nhiều luồng trong pthread_sigmask để có ví dụ tạo chuỗi xử lý tín hiệu đặc biệt. Sau này không cần thiết nếu bạn đang sử dụng vòng lặp sự kiện trong chuỗi chính có thể xử lý tín hiệu, chỉ cần bỏ chặn các tín hiệu trước khi vào vòng lặp sự kiện.

+0

Điều gì xảy ra nếu bạn chỉ muốn dựa vào các hàm C++ 11 chuẩn? Bạn có thể thiết lập một xử lý tín hiệu với std :: tín hiệu trong khi tạo chủ đề * mà không có * tín hiệu chặn và chỉ đơn giản là để cho một chủ đề ngẫu nhiên bắt tín hiệu? Bộ xử lý tín hiệu sẽ phải đơn giản, sẽ cần liên kết C và tốt nhất là chỉ truy cập vào một int dễ bay hơi. Nhưng liệu đây có phải là chuẩn C++ 11 và kết quả trong hành vi được xác định rõ trong môi trường đa luồng không? – JohnCand

+1

@ JohnCaC2 Có lẽ không, tín hiệu phần lớn nằm ngoài phạm vi của tiêu chuẩn C++. –

+0

Tôi tìm thấy nó kỳ lạ rằng các quyền hạn được để lại cho mỗi mặt nạ tín hiệu thread ra khỏi c + + 11 nhưng adressed phần còn lại của luồng trong std. Thiết lập xử lý tín hiệu đúng cách trong một ứng dụng đa luồng là một phần quan trọng trong việc viết các ứng dụng lớp doanh nghiệp. Nó có mùi như một giải pháp nướng nửa để thẳng thắn.Bây giờ bạn trở lại libpthread để làm điều đó và kết thúc với một hỗn hợp không lành mạnh của các chủ đề std và các chủ đề posix và hy vọng std sử dụng pthreads để làm điều của nó đằng sau cảnh – Waslap