2012-03-23 19 views
6

async-tín hiệu Theo APUE 2e Chương 12.5:Sự khác nhau giữa đề an toàn và an toàn

Nếu một chức năng là reentrant liên quan đến nhiều chủ đề với, chúng ta nói rằng nó là thread-safe. Tuy nhiên, điều này không cho chúng ta biết liệu chức năng có reentrant đối với các trình xử lý tín hiệu hay không. Chúng tôi nói rằng một chức năng an toàn được đưa vào từ bộ xử lý tín hiệu không đồng bộ là an toàn tín hiệu không đồng bộ.

Câu hỏi của tôi là

Q1:

Có một "chung góc lõm" khái niệm (có nghĩa là tái entrantcy trong mọi hoàn cảnh)? Nếu có, có tham gia lại chung bằng với người tham gia lại đối với cả tín hiệu đa luồng và không đồng bộ? Hoặc cũng có một điều kiện thứ ba phải được xem xét khi nói về người tái nhập chung?

Q2:

An toàn chủ đề không bao hàm sự an toàn không đồng bộ, rõ ràng. Tuy nhiên, không an toàn tín hiệu đồng bộ ngụ ý an toàn chủ đề cho chắc chắn? Tôi googled rất nhiều, mọi người đang nói rằng nó, nhưng tôi không thể tìm thấy bất kỳ nguồn cho nó.

Q3:

Nếu câu trả lời cho cả Q1 và Q2 là có, tôi đoán chung tái ký dự thi chỉ tương đương với async-tín hiệu an toàn không?

Trả lời

5

Q1: an toàn không đồng bộ tín hiệu là khái niệm mạnh nhất về sự reentrancy. Nó đòi hỏi phải sử dụng rất cẩn thận tài nguyên và khó quản lý trong mã ứng dụng đa nền tảng.

Q2: an toàn-tín hiệu an toàn ngụ ý chủ đề an toàn. Chủ đề an toàn có nghĩa là nó OK để thử gọi chức năng hai lần, nhưng từ chủ đề khác nhau; an toàn async-signal mạnh hơn vì hai invocations của hàm có thể nằm trong cùng một luồng. Điều này làm cho mọi thứ trở nên khó khăn hơn, bởi vì bạn không thể chờ cuộc gọi khác của hàm để giải phóng khóa của nó, cuộc gọi thứ hai bên trong trình xử lý tín hiệu phải có khả năng làm gián đoạn cuộc gọi đầu tiên ngay cả khi tài nguyên được chia sẻ ở trạng thái không nhất quán , sau đó khôi phục mọi thứ khi nó thoát. Về cơ bản không thể sử dụng tài nguyên/trạng thái chia sẻ từ trình xử lý tín hiệu: luôn sử dụng "mẹo tự lừa" trừ khi bạn thực sự biết cách xử lý tín hiệu hoạt động và có lý do không rõ ràng để viết mã điên.

Q3: một số người có thể sử dụng reentrant để chỉ có nghĩa là chỉ an toàn. Trình xử lý tín hiệu Unix là nơi duy nhất phổ biến ở bất cứ nơi nào cần thiết hơn, và điều đó hơi mơ hồ bởi vì bạn không nên cố gắng làm bất cứ điều gì thông minh ở đó.

+0

Tôi tìm thấy ví dụ này: https://en.wikipedia.org/wiki/Reentrancy_(computing) Tham khảo chức năng hoán đổi thứ 2 trong wiki, đó là an toàn-tín hiệu không đồng bộ, nhưng không an toàn. Vì vậy, tôi nghĩ rằng an toàn-tín hiệu an toàn không bao hàm thread an toàn. – PickBoy

+0

Điểm tốt, đó là một ví dụ! Khá contrived mặc dù. –