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ì?