2011-08-30 10 views
5

私はこのコードを持っている:のstd ::マップ::奇妙な行動のミューテックス

//// 
// Default Namespaces 
/// 

using namespace std; 

typedef map <string, boost::shared_mutex> t_map_shared_mutex; 

int main(int argc, char** argv) { 

    t_map_shared_mutex list_lock; 

    boost::shared_mutex global_lock; 

    string   i = "ABC"; 

    boost::unique_lock <boost::shared_mutex> l_lock (global_lock); 

    boost::unique_lock <boost::shared_mutex> lock (list_lock[i]); 
     //Do Something with that lock 
    lock.unlock(); 

    l_lock.unlock(); 

} 

これは、次のエラーを生成します。私が理解していること(そして私はここで間違っているかもしれません)から、g ++はミューテックスがconst値として渡されていることを私に伝えています。

In file included from /usr/include/c++/4.4/utility:63, 
       from /usr/include/boost/config/no_tr1/utility.hpp:21, 
       from /usr/include/boost/config/select_stdlib_config.hpp:33, 
       from /usr/include/boost/config.hpp:40, 
       from /usr/include/boost/date_time/compiler_config.hpp:12, 
       from /usr/include/boost/date_time/posix_time/posix_time.hpp:14, 
       from prova.cpp:5: 
/usr/include/c++/4.4/bits/stl_pair.h: In constructor ‘std::pair<_T1, _T2>::pair(const _T1&, const _T2&) [with _T1 = const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _T2 = boost::shared_mutex]’: 
/usr/include/c++/4.4/bits/stl_map.h:450: instantiated from ‘_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = boost::shared_mutex, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_mutex> >]’ 
prova.cpp:66: instantiated from here 
/usr/include/c++/4.4/bits/stl_pair.h:84: error: no matching function for call to ‘boost::shared_mutex::shared_mutex(const boost::shared_mutex&)’ 
/usr/include/boost/thread/pthread/shared_mutex.hpp:47: note: candidates are: boost::shared_mutex::shared_mutex() 
/usr/include/boost/thread/pthread/shared_mutex.hpp:21: note:     boost::shared_mutex::shared_mutex(boost::shared_mutex&) 
/usr/include/c++/4.4/bits/stl_pair.h: In constructor ‘std::pair<_T1, _T2>::pair(const std::pair<_U1, _U2>&) [with _U1 = const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _U2 = boost::shared_mutex, _T1 = const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _T2 = boost::shared_mutex]’: 
/usr/include/c++/4.4/ext/new_allocator.h:105: instantiated from ‘void __gnu_cxx::new_allocator<_Tp>::construct(_Tp*, const _Tp&) [with _Tp = std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_mutex>]’ 
/usr/include/c++/4.4/bits/stl_tree.h:371: instantiated from ‘std::_Rb_tree_node<_Val>* std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_create_node(const _Val&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Val = std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_mutex>, _KeyOfValue = std::_Select1st<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_mutex> >, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_mutex> >]’ 
/usr/include/c++/4.4/bits/stl_tree.h:881: instantiated from ‘std::_Rb_tree_iterator<_Val> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_(const std::_Rb_tree_node_base*, const std::_Rb_tree_node_base*, const _Val&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Val = std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_mutex>, _KeyOfValue = std::_Select1st<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_mutex> >, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_mutex> >]’ 
/usr/include/c++/4.4/bits/stl_tree.h:1215: instantiated from ‘std::_Rb_tree_iterator<_Val> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique_(std::_Rb_tree_const_iterator<_Val>, const _Val&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Val = std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_mutex>, _KeyOfValue = std::_Select1st<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_mutex> >, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_mutex> >]’ 
/usr/include/c++/4.4/bits/stl_map.h:540: instantiated from ‘typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, typename _Alloc::rebind<std::pair<const _Key, _Tp> >::other>::iterator std::map<_Key, _Tp, _Compare, _Alloc>::insert(typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, typename _Alloc::rebind<std::pair<const _Key, _Tp> >::other>::iterator, const std::pair<const _Key, _Tp>&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = boost::shared_mutex, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_mutex> >]’ 
/usr/include/c++/4.4/bits/stl_map.h:450: instantiated from ‘_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = boost::shared_mutex, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_mutex> >]’ 
prova.cpp:66: instantiated from here 
/usr/include/c++/4.4/bits/stl_pair.h:101: error: no matching function for call to ‘boost::shared_mutex::shared_mutex(const boost::shared_mutex&)’ 
/usr/include/boost/thread/pthread/shared_mutex.hpp:47: note: candidates are: boost::shared_mutex::shared_mutex() 
/usr/include/boost/thread/pthread/shared_mutex.hpp:21: note:     boost::shared_mutex::shared_mutex(boost::shared_mutex&) 

どのように解決するには?

答えて

11

STLコンテナには、値型のコピーコンストラクタが必要です。 mutexはコピーできないので、mapに直接入れることはできません。代わりにmutexへのポインタ(おそらくstd::unique_ptrまたはboost::ptr_map経由)を使用する必要があります。

+0

たぶん私のスキルはそれほど強くない..ですあなたはどうしますか?コードを教えてもらえますか? – St0rM

+2

@ St0rM - 私は仕事が必要な標準的な容器であなたのスキルがいっそう高いと言います。あなたが何をしているのかを知っていれば、オブジェクトを直接コンテナに入れても問題ない場合もあります。しかし、一般的には、**オブジェクトへのポインタをコンテナ**(std :: mapのように)に置くことを考えなければなりません。**オブジェクトではありません**。コンテナは、オブジェクトが適切に見えるように内部的にオブジェクトをコピーすることができるので、コンストラクタとデストラクタを呼び出すタイミングを実際に制御することはできません。 –

+3

@テッド:あなたは一般的にあなたが本当に意味するものではありませんか?コンテナ内のポインタは通常正しくありません。 – GManNickG

0

std::mapはそれconst boost::shared_mutex&を渡すことによってboost::shared_mutexのコピーコンストラクタを呼び出すようにしようとしているように、私には思われるが、そのようなコンストラクタが使用できない:ブーストミューテックスと

/usr/include/c++/4.4/bits/stl_pair.h:84: error: no matching function for call to ‘boost::shared_mutex::shared_mutex(const boost::shared_mutex&)’ 
/usr/include/boost/thread/pthread/shared_mutex.hpp:47: note: candidates are: boost::shared_mutex::shared_mutex() 
/usr/include/boost/thread/pthread/shared_mutex.hpp:21: note:     boost::shared_mutex::shared_mutex(boost::shared_mutex&)