2010-07-29 27 views

Trả lời

23

Trình xử lý tín hiệu có thể được gọi bất cứ lúc nào, kể cả trong thời gian khi có cuộc gọi khác đến malloc. Nếu điều này xảy ra, một trong hai điều sẽ xảy ra:

  1. Quá trình của bạn sẽ bế tắc trong bộ xử lý tín hiệu, vì malloc sẽ không thể lấy khóa heap.
  2. Quá trình của bạn sẽ bị hỏng heap, bởi vì mallockhông lấy khóa (hoặc không nghĩ nó cần), sau đó tiến hành hiển thị không nhất quán, dẫn đến sự cố sau.
+0

Thú vị. Nhưng bạn có thể giải thích tại sao điều này không thể xảy ra trong quá trình chuyển ngữ cảnh luồng thông thường? Heap cũng được chia sẻ giữa tất cả các luồng trong một tiến trình. Là malloc() không thể có trước, ngoại trừ trong quá trình gọi trình xử lý tín hiệu? –

+9

Đây là cũ, nhưng nó có giá trị trả lời: Khi một tín hiệu đến, nó được xử lý INSIDE một sợi trong quá trình. Trường hợp đơn giản nhất tôi có thể nghĩ đến liên quan đến một luồng bắt tín hiệu khi nó đang gọi malloc (cho phép nói, sau khi nó nhận được khóa). Sau đó, trình xử lý tín hiệu gọi malloc. Khi nó cố gắng để có được khóa, nó thấy rằng khóa đã được tổ chức, vì vậy nó chờ đợi trên khóa. Một phần của chuỗi mà cuối cùng sẽ giải phóng khóa sẽ KHÔNG BAO GIỜ chạy, bởi vì nó chờ xử lý tín hiệu kết thúc. Trình xử lý tín hiệu sẽ không bao giờ kết thúc vì nó đang đợi khóa –

+0

Đó là vấn đề bế tắc. Vấn đề tham nhũng xảy ra khi khóa được giữ lại. Trong trường hợp này, trình xử lý tín hiệu * là * có thể lấy khóa (vì nó được giữ bởi cùng một luồng), và tiến hành vít lên đống vì nó đang thực hiện một yêu cầu malloc hoàn toàn mới trong khi yêu cầu hiện tại (trên cùng một luồng) đang được tiến hành. Điều này không thể xảy ra nếu không có tín hiệu, vì các chủ đề khác sử dụng khóa để phối hợp. – BeeOnRope

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