2011-06-28

multiple_lock_guardとか欲しいよね

複数のmutexに対するlock_guardが欲しいと思ったので書いてみた。動くかどうかテストしていない。

template < int I >
struct unlock
{
    template < typename T >
    void apply( T & t )
    {
        unlock< I - 1 >::apply( t ) ;
        std::get<I>(t)->unlock() ;
    }
} ;

template <>
struct unlock<0>
{
    template < typename T >
    void apply( T & t )
    {
        std::get<0>(t)->unlock() ;
    }    
} ;

template < typename ... Types >
class multiple_lock_guard
{
public :
    typedef std::tuple< Types *... > type ;
    
    multiple_lock_guard( Types & ... args )
        : m( &args... )
    {
        std::lock( args... ) ;
    }

    ~multiple_lock_guard()
    {
        unlock< sizeof...(Types) - 1 >::apply( m ) ;
    }

    multiple_lock_guard( multiple_lock_guard const & ) = delete ;
    multiple_lock_guard & operator = ( multiple_lock_guard const & ) = delete ;

private :
    type m ;
} ;

こういうふうに使う。

std::mutex m1, m2, m3 ;

int main()
{
    multiple_lock_guard< std::mutex, std::mutex, std::mutex >
        guard( m1, m2, m3 ) ;
} 

追記、コピーコンストラクタ―と代入演算子のdeleteを忘れていた。

No comments: