2013-04-09 37 views
6

Tôi chỉ tự hỏi nếu có bất kỳ chính sách khóa nào trong C++ 11 sẽ ngăn chặn các luồng khỏi đói.Làm thế nào để ngăn chặn các chủ đề khỏi nạn đói trong C++ 11

Tôi có một chuỗi các chủ đề đang cạnh tranh cho một mutex. Bây giờ, vấn đề của tôi là các thread đó là để lại một phần quan trọng bắt đầu ngay lập tức cạnh tranh cho cùng một mutex và hầu hết thời gian thắng. Vì vậy, các chủ đề khác chờ đợi trên mutex đang đói.

Tôi không muốn để chuỗi, để lại phần quan trọng, ngủ trong một khoảng thời gian tối thiểu để cho các chủ đề khác có cơ hội khóa mutex.

Tôi nghĩ rằng phải có một số thông số cho phép khóa công bằng cho các chuỗi đang chờ trên mutex nhưng tôi không thể tìm thấy giải pháp thích hợp nào. Vâng, tôi thấy std :: this_thread :: yield() chức năng, trong đó giả sử để sắp xếp lại thứ tự của thực hiện chủ đề, nhưng nó chỉ là gợi ý để lên lịch thread và phụ thuộc vào việc thực hiện thread scheduler nếu nó lên lịch lại các chủ đề hay không.

Có cách nào để cung cấp chính sách khóa công bằng cho các chuỗi đang chờ trên cùng một mutex trong C++ 11 không? Các chiến lược thông thường là gì?

Cảm ơn

+0

http://stackoverflow.com/questions/11666610/how-to-give-priority-to-privileged-thread-in-mutex-locking Dưới đây là một liên kết có thể giúp bạn !! –

+0

Điều này có vẻ là một vấn đề thiết kế không phải là một vấn đề đói thread, bạn có thể gửi mã để cho mọi người nhìn thấy nó và có lẽ giúp đỡ. – dirvine

+0

Bạn thường không nên có một loạt các chủ đề cạnh tranh cho một mutex - nếu mã của bạn là serial đó chỉ có một thread có thể làm việc cùng một lúc, tại sao không có ít chủ đề hơn? Có các lý do hợp lệ, nhưng chúng không phải là tất cả các lý do hợp lệ, và chúng có thể có các câu trả lời khác nhau! – Yakk

Trả lời

6

Đây là một tối ưu hóa phổ biến ở mutexes thiết kế để tránh lãng phí thời gian chuyển đổi nhiệm vụ khi thread tương tự có thể lấy mutex một lần nữa. Nếu luồng hiện tại vẫn còn thời gian trong lát thời gian của nó thì bạn sẽ nhận được nhiều thông lượng hơn về hướng dẫn người dùng thực hiện mỗi giây bằng cách cho phép nó thực hiện mutex thay vì tạm dừng và chuyển sang một chuỗi khác (có khả năng gây ra tải lại lớn các dòng bộ nhớ cache và các độ trễ khác nhau).

Nếu bạn có quá nhiều tranh cãi về một mutex thì đây là vấn đề thì thiết kế ứng dụng của bạn sai. Bạn có tất cả các chủ đề này bị chặn trên một mutex, và do đó không làm bất cứ điều gì: bạn có lẽ tốt hơn mà không có quá nhiều chủ đề.

Bạn nên thiết kế ứng dụng của mình để nếu có nhiều chuỗi cạnh tranh cho một mutex thì không quan trọng chuỗi nào lấy khóa. Tranh chấp trực tiếp cũng phải là một điều hiếm, đặc biệt là tranh chấp trực tiếp với nhiều chủ đề.

Tình huống duy nhất mà tôi có thể nghĩ đây là kịch bản OK là nơi mọi chuỗi đang chờ trên biến điều kiện, sau đó được phát để đánh thức tất cả. Mỗi thread sau đó sẽ contend cho mutex, nhưng nếu bạn đang làm điều này ngay sau đó tất cả họ nên làm một kiểm tra nhanh chóng rằng đây không phải là một đánh thức giả mạo và sau đó phát hành mutex. Thậm chí sau đó, điều này được gọi là một tình huống "sấm đàn", và không phải là lý tưởng, chính xác bởi vì nó nối tiếp tất cả các chủ đề này.

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