2014-04-19 22 views
7

tôi có thể sử dụng boost::lock_guard để có được một khóa trên một đối tượng boost::mutex và cơ chế này sẽ xác định rằng một khi boost::lock_guard đi ra khỏi phạm vi khóa sẽ được phát hành:Làm thế nào để sử dụng một lock_guard với try_lock_for

{ 
    boost::lock_guard<boost::mutex> lock(a_mutex); 
    // Do the work 
} 

Trong này trường hợp, a_mutex sẽ được phát hành bất kể khối mã đã bị ngoại lệ hay không.

Mặt khác, boost::timed_mutex cũng hỗ trợ phương thức try_lock_for(period), ví dụ:

if(a_timed_mutex.try_lock_for(boost::chrono::seconds(1))) { 
    // Do the work 
    a_timed_mutex.unlock(); // <- This is needed! 
} else { 
    // Handle the acquisition failure 
} 

Mã này sẽ không unlock() các a_timed_mutex nếu true khối tuyên bố if là đã thoát với một ngoại lệ.

Câu hỏi: Boost (và, như xa như tôi có thể thấy, không phải là tiêu chuẩn C++ 11) dường như không đưa ra một biến thể của lock_guard làm việc với try_lock() hoặc try_lock_for(period). Cách "được khuyến nghị" hoặc phương pháp hay nhất để xử lý tình huống thứ hai là gì?

Trả lời

10

Bạn có thể tạo bảo vệ khóa sau khi khóa, nói cho nó thông qua các khóa:

if(a_timed_mutex.try_lock_for(boost::chrono::seconds(1))) { 
    boost::lock_guard<boost::mutex> lock(a_timed_mutex, boost::adopt_lock_t()); 
    // Do the work 
} else { 
    // Handle the acquisition failure 
} 

Tiêu chuẩn lock_guard cũng cho phép này.

-1

thử unique_lock, unique_lock :: try_lock_for()

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