2017-03-25 25 views

Trả lời

20

Sự khác biệt duy nhất và quan trọng là std::scoped_lock có hàm tạo variadic sử dụng nhiều hơn một mutex. Điều này cho phép để khóa nhiều mutexes trong một bế tắc tránh cách như thể std::lock đã được sử dụng.

{ 
    // safely locked as if using std::lock 
    std::scoped_lock<std::mutex, std::mutex> lock(mutex1, mutex2);  
} 

Trước đây bạn phải làm một điệu nhảy nhỏ để khóa nhiều mutexes trong một cách an toàn sử dụng std::lock như được giải thích this answer.

Việc bổ sung khóa phạm vi giúp việc sử dụng này dễ dàng hơn và tránh các lỗi liên quan. Bạn có thể xem xét std::lock_guard không được chấp nhận. Trường hợp đối số duy nhất của std::scoped_lock có thể được thực hiện như là một chuyên môn và như vậy bạn không phải lo lắng về các vấn đề hiệu suất có thể.

GCC 7 đã có hỗ trợ cho std::scoped_lock có thể xem được here.

Để biết thêm thông tin bạn có thể muốn đọc standard paper

+2

Đã trả lời câu hỏi của riêng bạn sau chỉ 10 phút. Bạn có thực sự không biết? – Walter

+5

@Walter Tôi đã https://stackoverflow.blog/2011/07/01/its-ok-to-ask-and-answer-your-own-questions/ – inf

+0

@Ruslan không chắc chắn ý của bạn là gì. Không có sự chậm trễ 10 phút. Khi bạn tạo câu hỏi, bạn đã có thể cung cấp câu trả lời. – inf

34

Các scoped_lock là một phiên bản hoàn toàn vượt trội của lock_guard mà khóa một số tùy ý của mutexes tất cả cùng một lúc (sử dụng cùng một thuật toán bế tắc tránh thể như std::lock). Trong mã mới, bạn chỉ nên sử dụng scoped_lock.

Lý do duy nhất lock_guard vẫn tồn tại là để tương thích. Nó không chỉ có thể bị xóa, bởi vì nó được sử dụng trong mã hiện tại. Hơn nữa, nó đã chứng minh không mong muốn để thay đổi định nghĩa của nó (từ unary sang variadic), bởi vì đó cũng là một quan sát, và do đó phá vỡ, thay đổi (nhưng vì lý do phần nào kỹ thuật).

+4

Ngoài ra, nhờ khấu trừ đối số mẫu lớp, bạn thậm chí không phải liệt kê ra các loại có thể khóa. –

+2

@NicolBolas: Đúng vậy, nhưng điều đó cũng áp dụng cho 'lock_guard'. Nhưng nó chắc chắn làm cho các lớp bảo vệ dễ sử dụng hơn một chút. –

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