Я смотрю видео о мьютексе и RAII.
В видео автор объясняет, что хорошее приложение RAII (использующее объект для управления ресурсом) - это мьютекс. У него есть следующий класс:
class Lock {
private:
Mutext_t* m_pm;
public:
explicit Lock(Mutex_t* pm) { Mutex_lock(pm); m_pm = pm; };
~Lock() { Mutex_unlock(m_pm); };
};
Я не уверен, как он реализовал Mutex_unlock и Mutex_lock.
Мой вопрос: Сопоставима ли следующая реализация, идостигнет ли он желаемого результата разблокировки мьютекса, если функция, для которой создается объект класса, создает исключение?
mutex mu;
class Lock { // Lock will be destroyed if stack is unwound
private:
mutex* p_Mutex;
public:
explicit Lock(mutex* Mutex) {
lock_guard<mutex> u_Lock(*Mutex);
p_Mutex = Mutex;
};
};
void functionB() {
Lock myLock(&mu);
// .. Do stuff that throws an error.
// Unwind stack and destroy myLock, unlocking the mutex?
}
Это очень простая реализация для целей обучения. Спасибо за вашу помощь.