2016-06-21 17 views
16

Khi nào tôi nên thích phần đầu tiên của mã để thứ hai, và làm họ có sự khác biệt cơ bảnmutex.lock vs unique_lock

std::mutex mtx; 
mtx.lock(); 
... //protected stuff 
mtx.unlock(); 
... //non-protected stuff 
mtx.lock(); 
... //etc 

std::mutex mtx; 
std::unique_lock<std::mutex> lck(mtx); 
... //protected stuff 
lck.unlock(); 
... //non-protected stuff 
lck.lock(); 
... //etc 

Tôi hiểu lock_guard rằng về cơ bản là một unique_lock không có chức năng khóa và mở khóa, nhưng tôi đang gặp khó khăn trong việc phân biệt một mutex và một khóa bằng cách sử dụng một mutex.

+0

liên quan cao: http://stackoverflow.com/questions/22873082/is-there- bất kỳ-idiomatic-explicit-use-of-mutexlock-hoặc-mở khóa – NathanOliver

Trả lời

18

Có, các cuộc gọi std::unique_lock mở khóa trên mutex trong hàm hủy của nó.

Lợi ích của việc này là trong trường hợp một số ngoại lệ được ném, bạn chắc chắn rằng mutex sẽ mở khóa khi rời khỏi phạm vi nơi std::unique_lock được xác định.

+0

Vì vậy, bằng cách sử dụng mutex đơn giản không được khuyến khích, như có một ngoại lệ có thể gây ra vấn đề với các khóa, mà unique_lock ngăn chặn? –

+1

Nếu bạn đang mã bên trong khóa có thể ném một ngoại lệ, sau đó có. Nếu bạn chỉ khóa một lần, và mở khóa ở cuối, hơn std :: lock_guard cũng sẽ làm công việc, và nó đơn giản hơn std :: unique_lock – gbehar

5

nghĩ về nó theo cách này:

// define a mutex 
std::mutex mtx; 

... rất lâu sau ...

void something_safe() 
{ 

    // code in these braces is a critical section 
    { 
    auto lock = std::unique_lock<std::mutex>(mtx); // equivalent to mtx.lock(); 
    ... //protected stuff 
    } // <---- however you leave this brace, equivalent to mtx.unlock(); 

    ... //non-protected stuff 
} 
+1

điều này không giải quyết bất kỳ câu hỏi nào được hỏi. –

+0

Hàng đợi chỉnh sửa cho bài đăng này là đầy đủ, nhưng về cơ bản những gì Richard đang cố gắng đạt được là với unique_lock bạn không phải mở khóa một cách rõ ràng mutex - nó mở khóa khi đối tượng unique_lock không nằm trong phạm vi. –

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