C ++ 14 dường như đã bỏ qua một cơ chế để kiểm tra xem có std::mutex
bị khóa hay không. Xem câu hỏi SO này:
https://stackoverflow.com/questions/21892934/how-to-assert-if-a-stdmutex-is-locked
Có một số cách xung quanh điều này, ví dụ bằng cách sử dụng;
std::mutex::try_lock()
std::unique_lock::owns_lock()
Nhưng cả hai đều không phải là giải pháp đặc biệt thỏa mãn.
try_lock()
được phép trả lại âm tính giả và có hành vi không xác định nếu luồng hiện tại đã khóa mutex. Nó cũng có tác dụng phụ. owns_lock()
yêu cầu xây dựng unique_lock
trên đầu trang của bản gốc std::mutex
.
Rõ ràng là tôi có thể tự lăn, nhưng tôi muốn hiểu các động lực cho giao diện hiện tại.
Khả năng kiểm tra trạng thái của một mutex (ví dụ std::mutex::is_locked()
) dường như không phải là một yêu cầu bí truyền đối với tôi, vì vậy tôi nghi ngờ Ủy ban Tiêu chuẩn cố tình bỏ qua tính năng này thay vì là một sự giám sát.
Tại sao?
Chỉnh sửa: Ok vì vậy có thể trường hợp sử dụng này không phổ biến như tôi mong đợi, vì vậy tôi sẽ minh họa kịch bản cụ thể của mình. Tôi có một thuật toán học máy được phân phối trên nhiều luồng. Mỗi luồng hoạt động không đồng bộ và trở về nhóm chính sau khi hoàn thành vấn đề tối ưu hóa.
Sau đó nó khóa một mutex master. Sau đó, chủ đề phải chọn một bố mẹ mới để đột biến con cái, nhưng chỉ có thể chọn từ bố mẹ hiện không có con cái đang được tối ưu hóa bởi các chủ đề khác. Do đó, tôi cần phải thực hiện tìm kiếm để tìm cha mẹ hiện không bị khóa bởi một luồng khác. Không có rủi ro về tình trạng của mutex thay đổi trong quá trình tìm kiếm, vì mutex chủ đề bị khóa. Rõ ràng là có các giải pháp khác (hiện tôi đang sử dụng cờ boolean) nhưng tôi nghĩ rằng mutex cung cấp một giải pháp hợp lý cho vấn đề này, vì nó tồn tại cho mục đích đồng bộ hóa giữa các luồng.
is_locked
?