複数の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:
Post a Comment