Tôi hiểu rằng hầu hết các triển khai phổ biến của một mutex (ví dụ std :: mutex trong C ++) không đảm bảo tính công bằng - nghĩa là, họ không đảm bảo rằng trong các trường hợp tranh chấp, khóa sẽ được lấy bởi các luồng theo thứ tự mà họ gọi là khóa (). Trên thực tế, thậm chí có thể (mặc dù hy vọng là không phổ biến) rằng trong trường hợp có sự tranh chấp cao, một số chủ đề đang chờ để có được mutex có thể không bao giờ có được nó.
Điều này có vẻ như là một hành vi không có ích với tôi - dường như với tôi rằng một mutex công bằng sẽ mang lại hành vi phù hợp hơn với những gì một lập trình viên muốn / mong đợi.
Lý do được đưa ra là tại sao các mutex thường không được triển khai để công bằng là "hiệu suất", nhưng tôi muốn hiểu rõ hơn điều đó có nghĩa là gì - đặc biệt, làm thế nào để thư giãn yêu cầu công bằng của mutex cải thiện hiệu suất? Có vẻ như một mutex "công bằng" sẽ không quan trọng để thực hiện - chỉ cần khóa () nối chuỗi cuộc gọi vào đuôi của danh sách được liên kết của mutex trước khi đưa luồng vào chế độ ngủ, sau đó mở khóa () bật chuỗi tiếp theo từ người đứng đầu danh sách đó và đánh thức nó
Cái nhìn sâu sắc về triển khai mutex nào tôi còn thiếu ở đây, điều đó sẽ giải thích tại sao nó được coi là đáng giá để hy sinh sự công bằng để có hiệu suất tốt hơn?