在使用mutex的时候,我们往往会陷入因为忘记释放mutex而导致的麻烦,这个给程序员带来很多的麻烦,根据c++标准可知,局部变量在生命周期结束时,一定会被析构掉(除非在异常处理过程中,另外一个异常在析构函数中被抛出),所以我们不妨使用这种特性来完成mutex的锁定和解锁功能。它的基本思路时在构造函数中获取锁,在析构函数中释放锁。我定义了一个模板类,用于此功能,希望对网友有所帮助。
// Author : Wang yanqing
// Module : Sync
// Version : 0.01
// Date : 03-Aug-2005
// Reversion:
// Date :
// EMail : hello.wyq@gmail.com
#ifndef _AUTO_LOCK_H
#define _AUTO_LOCK_H
#include <stdexcept>
template <typename T>
class AutoLock
{
// Support recursive mutex when T provides it.
long counter;
T &t;
template <typename U>
AutoLock( const AutoLock<U> &rhs );
template <typename U>
AutoLock<T>& operator =( const AutoLock<U> &rhs );
public:
explicit AutoLock( T &_t, bool locked = true )
: counter( 0 ), t( _t )
{
if ( locked )
lock();
}
~AutoLock()
{
if ( counter > 0 )
{
if( counter != 1 )
throw std::logic_error( "lock & unlock unmatched" );
unlock();
}
}
inline bool trylock()
{
bool locked = t.trylock();
if ( locked )
{
// It's safe when mutex has been locked
++ counter;
}
return locked;
}
inline void lock()
{
t.lock();
// It's safe because mutex has been locked
++ counter;
}
inline void unlock()
{
// Update it before unlocking mutex, so it's safe
if( -- counter < 0 )
throw std::logic_error( "lock & unlock unmatched" );
t.unlock();
}
};
#endif
// Author : Wang yanqing
// Module : Sync
// Version : 0.01
// Date : 03-Aug-2005
// Reversion:
// Date :
// EMail : hello.wyq@gmail.com
#ifndef _AUTO_LOCK_H
#define _AUTO_LOCK_H
#include <stdexcept>
template <typename T>
class AutoLock
{
// Support recursive mutex when T provides it.
long counter;
T &t;
template <typename U>
AutoLock( const AutoLock<U> &rhs );
template <typename U>
AutoLock<T>& operator =( const AutoLock<U> &rhs );
public:
explicit AutoLock( T &_t, bool locked = true )
: counter( 0 ), t( _t )
{
if ( locked )
lock();
}
~AutoLock()
{
if ( counter > 0 )
{
if( counter != 1 )
throw std::logic_error( "lock & unlock unmatched" );
unlock();
}
}
inline bool trylock()
{
bool locked = t.trylock();
if ( locked )
{
// It's safe when mutex has been locked
++ counter;
}
return locked;
}
inline void lock()
{
t.lock();
// It's safe because mutex has been locked
++ counter;
}
inline void unlock()
{
// Update it before unlocking mutex, so it's safe
if( -- counter < 0 )
throw std::logic_error( "lock & unlock unmatched" );
t.unlock();
}
};
#endif