2013-06-14 29 views
37

Lưu ý: Câu hỏi này liên quan đến C++ 11. Câu trả lời cho cùng một câu hỏi trong C++ 17 (hoặc các phiên bản mới hơn) có thể đã thay đổi. Để biết chi tiết:Cách tốt nhất để khóa nhiều std :: mutex'es là gì?


Khi chúng ta muốn khóa nhiều std::mutex 'es, chúng tôi sử dụng std::lock(). Nhưng std::lock() không cung cấp tính năng RAII.

Khi chúng tôi muốn khóa std::mutex theo cách của RAII, chúng tôi sử dụng std::lock_guard. Nhưng std::lock_guard không thể khóa nhiều an toàn std::mutex '.

Có cách nào để tận dụng lợi thế của cả hai phương pháp, để khóa nhiều cách std::mutex 'theo cách RAII?

Trả lời

61

Có, bạn có thể sử dụng std::unique_lock với std::defer_lock. Nó nói với unique_lock không khóa ngay lập tức mutex, nhưng để xây dựng trình bao bọc RAII.

std::unique_lock<std::mutex> lk1(mutex1, std::defer_lock); 
std::unique_lock<std::mutex> lk2(mutex2, std::defer_lock); 
std::lock(lk1, lk2); 

Do bản chất của nó variadic std::lock không bị ràng buộc để chỉ có hai đối số nhưng có thể được sử dụng với nhiều lập luận như trình biên dịch của bạn có hỗ trợ cho.

Howard Hinnant cũng chỉ ra một thông tin thú vị về hiệu suất, bạn có thể kiểm tra liên kết this nếu bạn quan tâm. Ông giải quyết các mối quan tâm về hiệu suất và cho thấy rằng std::lock có thể được triển khai hiệu quả, tôi cũng có thể khuyên bạn nên đọc tất cả các nhận xét trong bài đăng đó.

+12

+1 Và 'std :: lock' không giới hạn chỉ hai khóa. Nó có thể xử lý bất kỳ số nào (lên đến giới hạn trình biên dịch trên các mẫu variadic). –

+2

Đã có những lo ngại về hiệu quả của 'std :: lock'. Xem câu trả lời này: http://stackoverflow.com/a/14525010/576911 để giải quyết những mối quan tâm đó. –

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