- Cách tốt nhất để kiểm soát luồng tín hiệu được chuyển đến là gì?
Như @ zoli2k đã chỉ ra, chỉ định rõ ràng một luồng duy nhất để xử lý tất cả các tín hiệu bạn muốn xử lý (hoặc một tập hợp mỗi luồng có trách nhiệm tín hiệu cụ thể), là một kỹ thuật tốt.
- Cách tốt nhất để nói với một chuỗi khác (thực sự có thể đang bận) rằng tín hiệu đã đến là gì? [...]
- Làm thế nào tôi có thể xử lý một cách an toàn việc chuyển thông tin mà một tín hiệu đã xảy ra đến các chuỗi khác? Điều này có cần phải xảy ra trong trình xử lý tín hiệu không?
Tôi sẽ không nói "tốt nhất", nhưng đây là đề xuất của tôi:
Chặn tất cả các tín hiệu mong muốn trong main
, để tất cả các luồng kế thừa mặt nạ tín hiệu đó. Sau đó, tạo chuỗi nhận tín hiệu đặc biệt như một vòng lặp sự kiện theo hướng tín hiệu, gửi các tín hiệu mới đến như một số giao tiếp nội bộ khác .
Cách đơn giản nhất để làm điều này là để luồng chấp nhận các tín hiệu trong một vòng lặp bằng cách sử dụng sigwaitinfo
hoặcsigtimedwait
. Sau đó, luồng chuyển đổi các tín hiệu bằng cách nào đó, có lẽ là phát a pthread_cond_t
, đánh thức các luồng khác với nhiều I / O hơn, xếp hàng một lệnh trong hàng đợi an toàn luồng dành riêng cho ứng dụng, bất cứ điều gì.
Ngoài ra, luồng đặc biệt có thể cho phép các tín hiệu được gửi đến bộ xử lý tín hiệu, chỉ xuất hiện để gửi khi sẵn sàng xử lý tín hiệu. ( sigwait
Tuy nhiên, việc phân phối tín hiệu qua bộ xử lý có xu hướng dễ xảy ra lỗi hơn so với việc nhận tín hiệu qua bộ xử lý.) Trong trường hợp này, bộ xử lý tín hiệu của bộ nhận thực hiện một số hành động đơn giản và không an toàn tín hiệu: thiết lậpsig_atomic_t
cờ, gọi sigaddset(&signals_i_have_seen_recently, latest_sig)
, write
() một byte đến một đường ống tự không chặn , v.v. Sau đó, quay trở lại vòng lặp chính được che mặt của nó, luồng giao tiếp nhận tín hiệu đến các luồng khác như trên.
( CẬP NHẬT @caf chỉ ra một cách đúng đắn rằng các sigwait
phương pháp tiếp cận là ưu việt hơn.)