Как правильно написать MutexLocker? Создал самописную обёртку MutexLocker, согласно RAII.class pthread_mutex_locker { public: pthread_mutex_locker(pthread_mutex_wrapper * mu); ~pthread_mutex_locker(); private: pthread_mutex_wrapper * mutex; }; Применил свой MutexLocker c анонимным объектом.// Тело какой-то функции. { pthread_mutex_locker(&mutex); //Какой-то код } Есть подзрение, что анонимный объект уничтожается раньше, чем нужно и не защищает код. Как сделать, что бы он уничтожался во время выхода из функции. Должен ли MutexLocker быть именнованным объетом? Гарантируется ли уничтожение именнованных объектов по выходу из функции,а не вдругом месте? gcc version 4.8.1 20130909
Для того чтобы гарантировать, что объект MutexLocker уничтожается только после выхода из функции, его следует создавать как именованный объект внутри функции, а не как анонимный объект.
Пример:
// Объявление MutexLocker class MutexLocker { public: MutexLocker(pthread_mutex_wrapper *mu) : mutex(mu) { pthread_mutex_lock(mutex); } ~MutexLocker() { pthread_mutex_unlock(mutex); } private: pthread_mutex_wrapper *mutex; }; // Тело функции void someFunction() { pthread_mutex_wrapper mu; { MutexLocker locker(&mu); // Код, требующий защиты мьютексом } // MutexLocker уничтожится здесь, после выхода из блока }
Таким образом, создавая объект MutexLocker внутри блока, вы гарантируете, что он будет уничтожен только после выхода из блока, при этом обеспечивая защиту кода мьютексом.
Именнованные объекты гарантированно уничтожаются при выходе из области видимости, в которой они были созданы, поэтому именованный объект MutexLocker будет быть уничтожен в конце функции, как и любой другой локальный объект.
Для того чтобы гарантировать, что объект MutexLocker уничтожается только после выхода из функции, его следует создавать как именованный объект внутри функции, а не как анонимный объект.
Пример:
// Объявление MutexLockerclass MutexLocker {
public:
MutexLocker(pthread_mutex_wrapper *mu) : mutex(mu) {
pthread_mutex_lock(mutex);
}
~MutexLocker() {
pthread_mutex_unlock(mutex);
}
private:
pthread_mutex_wrapper *mutex;
};
// Тело функции
void someFunction() {
pthread_mutex_wrapper mu;
{
MutexLocker locker(&mu);
// Код, требующий защиты мьютексом
}
// MutexLocker уничтожится здесь, после выхода из блока
}
Таким образом, создавая объект MutexLocker внутри блока, вы гарантируете, что он будет уничтожен только после выхода из блока, при этом обеспечивая защиту кода мьютексом.
Именнованные объекты гарантированно уничтожаются при выходе из области видимости, в которой они были созданы, поэтому именованный объект MutexLocker будет быть уничтожен в конце функции, как и любой другой локальный объект.