Trong trường hợp này, không có mutex sẽ không được mở khóa khi mã này nằm ngoài phạm vi.
Tủ khóa Mutex sau RAII sử dụng thực tế là trình phá hủy được tự động gọi khi đối tượng được phân bổ không được cấp phát vượt quá phạm vi. Sau đó, nó mở khóa mutex khi đối tượng đã khóa mutex không nằm trong phạm vi. Trong trường hợp mã của bạn, không có đối tượng nào được cấp phát trong phạm vi dấu ngoặc ôm, do đó không có khả năng mở khóa mutex khi phạm vi kết thúc.
Ví dụ, sử dụng QMutexLocker
từ các thư viện Qt, bạn có thể đảm bảo rằng mutex bạn được mở khóa khi phạm vi được kết thúc:
{
QMutexLocker locker(myMutex);
if(checkSomething())
{
return;
}
doSomething();
}
Mã này cũng tương tự như:
{
mutex_lock(myMutex);
if(checkSomething())
{
mutex_unlock(myMutex);
return;
}
doSomething();
mutex_unlock(myMutex);
}
Mặc dù như Brian Neal chỉ ra, nó không xử lý an toàn trường hợp các trường hợp ngoại lệ là checkSomething()
và doSomething()
.
Cách thay thế cho Qt's QMutexLocker
sẽ là số std::lock_guard của STD.
Nguồn
2013-07-18 16:51:42
Bạn đang sử dụng triển khai mutex nào? Trừ khi bạn đang thực hiện mutex hỗ trợ RAII, bạn có thể sẽ phải mở khóa một cách rõ ràng mutex. – Void
Cảm ơn @Void. Tôi đang sử dụng pthread.h. Tức là pthread_mutex_unlock() và pthread_mutex_lock(). RAII là gì? –
@AmitNayar: Xem http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization.Nó có thể là thành ngữ quan trọng nhất trong C++, vì hầu như không thể quản lý bộ nhớ và các tài nguyên động khác một cách chính xác mà không có nó. –