Giả sử tôi có nhiều chuỗi chặn trên một cuộc gọi đến pthread_mutex_lock()
. Khi các mutex trở nên có sẵn, không thread đầu tiên được gọi là pthread_mutex_lock()
có được khóa? Tức là, các cuộc gọi đến pthread_mutex_lock()
theo thứ tự FIFO? Nếu không, thứ gì, nếu có, trật tự là họ? Cảm ơn!Thứ tự đánh thức `pthread_mutex_lock()` với nhiều luồng đang chờ đợi là gì?
Trả lời
Khi có sẵn mutex, chuỗi đầu tiên có được gọi là
pthread_mutex_lock()
lấy khóa không?
Không. Một trong các chủ đề chờ đợi bị khóa nhưng không nhận được chủ đề nào đang chờ.
Thứ tự FIFO?
FIFO mutex đúng là một mẫu. Xem Implementing a FIFO mutex in pthreads
Thứ tự FIFO là về thứ tự đánh thức mutex hiệu quả nhất có thể. Chỉ có một triển khai thực sự khủng khiếp sẽ sử dụng nó. Chủ đề chạy gần đây nhất có thể chạy lại mà không cần chuyển ngữ cảnh và chuỗi mới chạy gần đây, nhiều dữ liệu và mã của nó sẽ bị nóng trong bộ nhớ cache. Việc triển khai hợp lý cố gắng cung cấp cho mutex chủ đề giữ nó gần như hầu hết thời gian.
Hãy xem xét hai chủ đề mà làm điều này:
- Có được một mutex.
- Điều chỉnh một số dữ liệu.
- Phát hành mutex.
- Đi tới bước 1.
Bây giờ hãy tưởng tượng hai chủ đề chạy mã này trên một CPU lõi đơn. Cần phải rõ ràng rằng hành vi mutex FIFO sẽ dẫn đến một "điều chỉnh một số dữ liệu" cho mỗi chuyển đổi ngữ cảnh - kết quả tồi tệ nhất có thể xảy ra.
Tất nhiên, triển khai hợp lý thường làm cho một số gật đầu với sự công bằng. Chúng tôi không muốn một luồng không có tiến bộ về phía trước. Nhưng điều đó hầu như không biện minh cho việc thực hiện FIFO!
Ý tưởng của bạn về "hợp lý" không tương thích với hầu hết. Đặc biệt nó không tương thích với các yêu cầu thời gian thực; một sợi đơn nhanh chóng khóa và mở khóa mutex sẽ ngăn tiến trình chuyển tiếp trong bất kỳ luồng nào khác. Thứ tự FIFO trong mỗi mức độ ưu tiên là cách mutexes thông thường nên hoạt động để sử dụng thời gian thực mạnh mẽ. –
@R .. Các điểm ngắt POSIX không và không được dự định là thời gian thực.Chúng được dự định để tối đa hóa tiến trình tiến bộ của quá trình như một toàn thể mà không bị biểu lộ không công bằng. –
Mỗi POSIX, "Hàm pthread_mutex_unlock() sẽ giải phóng đối tượng mutex được tham chiếu bởi mutex. Cách thức mà một mutex được giải phóng phụ thuộc vào thuộc tính type của mutex. Nếu có chủ đề bị chặn trên đối tượng mutex được tham chiếu bởi mutex khi pthread_mutex_unlock () được gọi, dẫn đến mutex trở nên khả dụng, ** chính sách lập lịch sẽ xác định luồng nào sẽ có được mutex **. " (nhấn mạnh tôi) –
"Nếu có chủ đề bị chặn trên đối tượng mutex được tham chiếu bởi mutex khi pthread_mutex_unlock() được gọi, dẫn đến mutex trở nên khả dụng, chính sách lập lịch sẽ xác định chuỗi nào sẽ có được mutex."
Bên cạnh đó, câu trả lời cho câu hỏi của bạn không được chỉ định theo tiêu chuẩn POSIX. Nó có thể là ngẫu nhiên, hoặc nó có thể là trong FIFO hoặc LIFO hoặc bất kỳ thứ tự nào khác, theo các lựa chọn được thực hiện bởi việc thực hiện.
- 1. Điều kiện chờ đợi và chờ đợi
- 2. Phương thức chờ luồng Windows
- 3. đang chờ đợi tuyên bố vs biểu
- 4. Thứ tự đánh giá biểu thức mới?
- 5. Try Catch ngoài: đang chờ đợi Task.Run (()
- 6. Đang chờ trên nhiều sự kiện C++
- 7. Thứ tự mong đợi của một mảng được gửi dưới dạng HTML là gì?
- 8. Đang chờ phương thức không đồng bộ
- 9. Nhiều thời gian chờ đợi của Capybara?
- 10. Thứ tự MySQL được đánh giá theo thứ tự nào?
- 11. chờ đợi cho nhiều biến điều kiện trong tăng?
- 12. Đang chờ thay thế trong .NET 4.0?
- 13. Tôi có thể chờ Công việc thạch anh đang chờ theo thứ tự được kích hoạt không?
- 14. Đang đợi nhiều yêu cầu POST không đồng bộ
- 15. Thứ tự "nếu" và "phụ thuộc" được đánh giá là gì?
- 16. Perl quyết định thứ tự nào để đánh giá các thuật ngữ trong một biểu thức?
- 17. Đang đợi giá trị trả lại của phương thức
- 18. chờ Task.Factory.StartNew (() => so Task.Start; chờ đợi công tác;
- 19. Kết hợp chờ đợi ngầm và chờ đợi rõ ràng cùng kết quả trong thời gian chờ đợi bất ngờ
- 20. Có thể đánh dấu kiểm tra là đang chờ xử lý trong MiniTest không?
- 21. vui lòng đợi trong khi Jenkins là restarting- chờ đợi lâu
- 22. Trình tự đánh giá các biểu thức
- 23. Chính xác thì thông điệp 'Đang chờ phản hồi' trên tab Net của Firebug là gì?
- 24. Các luồng Java đang chờ khóa đối tượng không bị khóa (hiển nhiên) bị khóa
- 25. C# không đồng bộ, đang chờ đợi mà không có nhiệm vụ
- 26. Biểu thức async lambda với chờ đợi trả về Nhiệm vụ?
- 27. Thứ tự giải quyết hàm xây dựng là gì?
- 28. Truy cập vào giao diện điều khiển trong Task.Run với async/đang chờ đợi trên WinForms
- 29. Đang chờ người dùng nhập vào với thời gian chờ
- 30. C# - Đang chờ WinForms Message Loop
Bởi FIFO tôi chỉ có nghĩa là thread đầu tiên để gọi 'pthread_mutex_lock' đầu tiên để có được khóa khi nó có sẵn và như vậy cho các chủ đề tiếp theo. Đoán tôi đang thực hiện của riêng tôi. Cảm ơn bạn. – shanet
@shanet: * "Tôi chỉ có nghĩa là thread đầu tiên gọi 'pthread_mutex_lock' là người đầu tiên lấy khóa khi nó có sẵn "* - vâng, đó chính xác là những gì mà FIFO mutex nói đến. – LihO