2013-02-18 15 views

Trả lời

6

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

+0

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

+0

@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

1

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:

  1. Có được một mutex.
  2. Điều chỉnh một số dữ liệu.
  3. Phát hành mutex.
  4. Đ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!

+0

Ý 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ẽ. –

+0

@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. –

+0

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) –

1

"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.

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