2011-08-30 6 views
5

mam ten kod:std :: map of boost :: mutex z dziwnego zachowania

//// 
// 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(); 

} 

To generuje następujący błąd. Z tego, co rozumiem (i mógłbym być tu całkiem nie w porządku) g ++ mówi mi, że muteks jest przekazywany jako wartość const ... I nie rozumiem dlaczego.

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&) 

Jak rozwiązać ten problem?

Odpowiedz

11

Kontenery STL wymagają konstruktora kopii dla typu wartości; ponieważ muteksy nie mogą być kopiowane, nie można ich umieścić bezpośrednio w map. Musisz użyć wskaźnika do muteksu (być może poprzez std::unique_ptr lub boost::ptr_map).

+0

Może moje umiejętności z muteksy przypominającego nie jest tak silna .. . Jak byś to zrobił ? Czy możesz dać mi jakiś kod? – St0rM

+2

@ St0rM - Powiedziałbym, że jest to bardziej umiejętne ze standardowymi pojemnikami, które wymagają pracy. Istnieją sytuacje, w których można umieścić obiekty bezpośrednio w pojemniku, jeśli wiesz, co robisz. Ale generalnie powinieneś szukać ** umieszczania wskaźników na obiektach w pojemniku ** (jak std :: map), ** nie obiektów themsevles **. Kontenery mogą być kopiowane wewnątrz obiektów, zgodnie z ich potrzebami, więc nie masz żadnej kontroli nad tym, kiedy zostaną wywołane konstruktory i destruktory. –

+3

@TED: Tak naprawdę nie masz na myśli, prawda? Wskaźniki w pojemnikach zwykle nie są poprawne. – GManNickG

0

Wydaje mi jak std::map próbuje wywołać konstruktora kopii boost::shared_mutex przepuszczając ją const boost::shared_mutex&, ale nie taki konstruktor jest dostępny:

/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&)