2013-10-24 15 views

Trả lời

23

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_guardunique_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.

6

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.

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