Tôi đang bối rối về lý do tại sao lock_guard
tồn tại. Có phải là:Đang sử dụng unique_lock cho một tác vụ có thể được hoàn thành bởi lock_guard chậm hơn?
- Giao diện đơn giản hơn
unique_lock
? - Hiệu suất tốt hơn so với
unique_lock
? - Cái gì khác?
Tôi đang bối rối về lý do tại sao lock_guard
tồn tại. Có phải là:Đang sử dụng unique_lock cho một tác vụ có thể được hoàn thành bởi lock_guard chậm hơn?
unique_lock
?unique_lock
?lock_guard
có thể được triển khai với một đơn vị trạng thái: con trỏ hoặc tham chiếu đến loại Mutex
mà nó đã bị khóa.
unique_lock
có cho cả hai giữ trạng thái đó, và biết nếu nó hiện đang bị khóa, như một unique_lock
có thể có một Mutex
mà không bị khóa. Điều này có nghĩa là nó phải có ít nhất một trạng thái bổ sung là bool
.
lock_guard
cung cấp số không trên cao RAII khóa/mở khóa trình bao bọc xung quanh việc mua và phát hành Mutex
. Về cơ bản, lock_guard
có nghĩa là không có lý do nào để tránh sử dụng RAII để xử lý các khóa trên Mutex
.
unique_lock
chỉ có thể đạt đến 0 trên không nếu trình biên dịch có thể được thuyết phục để thông báo rằng bạn chỉ sử dụng nó theo cách mà lock_guard
có thể được sử dụng (ví dụ, xây dựng nó, sau đó phá hủy nó, mà không có nghịch với nó).
Ngoài các đối số hiệu quả đó, một lập trình viên nhìn thấy lock_guard
biết rằng nó sẽ kéo dài đến cuối phạm vi mà không phải kiểm tra mã trong phạm vi. Một lập trình viên nhìn thấy unique_lock
phải kiểm tra tất cả việc sử dụng biến để biết nếu đây là trường hợp.
Nhưng ở trên chỉ là một nửa lý do.
Lý do khác là vì phần lớn thư viện luồng cho C++ 11 dựa trên các thư viện boost
, vốn đã triển khai một thư viện luồng độc lập chủ yếu trên nền tảng. Boost có cả hai số lock_guard
và unique_lock
, với ngữ nghĩa gần giống hệt với phiên bản C++ 11.
Vì vậy, khi thư viện luồng boost
được chuẩn hóa, cả khi được mang vào và không ai loại bỏ chúng.
Bạn gần như trả lời câu hỏi của riêng bạn ở đây - 1) và 2) đều là lý do chính đáng. std::lock_guard là một đối tượng khóa đơn giản. Các tính năng như thời gian chờ khi mua lại mutex thêm vào độ phức tạp của nguyên thủy mutex, tăng cả thời gian cần thiết để thực hiện thao tác và xác suất tranh chấp cho mutex. Vậy tại sao phải trả cho những gì bạn không cần?
Cho dù 'try_locking' có hoặc không có thời gian chờ là thiết kế tốt là một câu hỏi khác; như hủy bỏ chuỗi, một thiết kế bị hỏng mà C++ 11 không thực hiện.