TL; DR Giả định ("hợp đồng") của đánh thức giả là một quyết định kiến trúc hợp lý được thực hiện để cho phép thực hiện mạnh mẽ thực tế của sheduler thread.
"Cân nhắc hiệu suất" không liên quan ở đây, đây chỉ là sự hiểu lầm đã trở nên phổ biến vì đã được nêu trong một tài liệu tham khảo có thẩm quyền được công bố. (tài liệu tham khảo có thẩm quyền có thể có sai sót, cậu biết đấy - chỉ cần hỏi Galileo Galilei ) bài viết trên Wikipedia giữ tham chiếu đến ghi chú mà bạn trích dẫn chỉ vì nó hoàn toàn phù hợp với chủ trương chính thức của họ về trích dẫn tài liệu tham khảo được công bố.
Lý do hấp dẫn hơn nhiều để giới thiệu khái niệm về đánh thức giả được cung cấp trong câu trả lời này tại SO dựa trên các chi tiết bổ sung được cung cấp trong một (phiên bản cũ hơn) của chính bài viết đó:
Bài viết trên Wikipedia về đánh thức giả có nội dung này:
Các pthread_cond_wait()
chức năng trong Linux được thực hiện bằng cách sử dụng futex
cuộc gọi hệ thống. Mỗi lệnh gọi hệ thống chặn trên Linux đột ngột trở lại EINTR
khi quá trình nhận được tín hiệu. ... pthread_cond_wait()
không thể khởi động lại sự chờ đợi vì nó có thể bỏ lỡ một sự thức tỉnh thực sự trong thời gian ngắn bên ngoài futex
cuộc gọi hệ thống ...
Chỉ cần nghĩ về nó ... giống như bất kỳ mã nào, bộ lập lịch luồng có thể bị mất điện tạm thời do có điều gì đó bất thường xảy ra trong phần cứng / phần mềm cơ bản. Tất nhiên, cần thận trọng để điều này xảy ra càng hiếm càng tốt, nhưng vì không có phần mềm mạnh mẽ nào 100% nên có lý khi cho rằng điều này có thể xảy ra và quan tâm đến sự phục hồi duyên dáng trong trường hợp nếu trình lập lịch phát hiện ra điều này (ví dụ bằng cách quan sát nhịp tim bị mất ).
Bây giờ, làm thế nào trình lập lịch biểu có thể phục hồi, có tính đến việc trong thời gian mất điện, nó có thể bỏ lỡ một số tín hiệu nhằm thông báo các chuỗi chờ? Nếu bộ lập lịch không làm gì, các chủ đề "không may mắn" được đề cập sẽ chỉ bị treo, chờ đợi mãi mãi - để tránh điều này, bộ lập lịch sẽ chỉ cần gửi tín hiệu đến tất cả các chủ đề đang chờ.
Điều này làm cho nó cần thiết để thiết lập một "hợp đồng" rằng chuỗi chờ có thể được thông báo mà không có lý do. Nói chính xác, sẽ có một lý do - tắt lịch trình - nhưng vì luồng được thiết kế (vì một lý do chính đáng) không để ý đến các chi tiết triển khai nội bộ của lịch trình, lý do này có thể tốt hơn để trình bày dưới dạng "giả".
Từ quan điểm chủ đề, điều này hơi giống với luật của Postel (còn gọi là nguyên tắc mạnh mẽ ),
Hãy thận trọng trong những gì bạn làm, hãy tự do trong những gì bạn chấp nhận từ người khác
Giả định về đánh thức giả buộc chủ đề phải thận trọng trong những gì nó làm : đặt điều kiện khi thông báo cho các luồng khác và tự do trong những gì nó chấp nhận : kiểm tra điều kiện khi có bất kỳ sự trở lại nào từ chờ đợi và lặp lại chờ đợi nếu chưa có.