2016-04-07 6 views
5

Ich mag den Schlüssel/Index in einer anderen Karte wie diese sperren:Wie verwendet man einen boost :: mutex als zugeordneten Typ in std :: map?

std::map<int, boost::mutex> pointCloudsMutexes_; 
pointCloudsMutexes_[index].lock(); 

Allerdings ist mir die folgende Fehlermeldung erhalten:

/usr/include/c++/4.8/bits/stl_pair.h:113: error: no matching function for call to 'boost::mutex::mutex(const boost::mutex&)' 
     : first(__a), second(__b) { } 
          ^

Es mit std::vector scheint zu funktionieren, aber nicht mit std::map. Was mache ich falsch?

+2

man fragt sich, welche Anforderungen zu der Designentscheidung geführt haben, dass eine Karte von Mutexen eine gültige Lösung ist. Es gibt wahrscheinlich einen viel eleganteren Weg, um das zu erreichen, was Sie wollen. –

+0

Eine gleichzeitige hashmap – Raaj

+0

Dieser Entwurf wird keine gleichzeitige Hash-Karte sein. Es wird eine nicht gleichzeitige Karte von Mutexen sein. Sie müssen die gesamte Map umbrechen und sie mit nur einem Mutex schützen. –

Antwort

4

In C++ vor C++ 11, muss der abgebildeten Art eines std::map sowohl Standard-konstruierbar und copy-konstruierbar, wenn operator[] Aufruf. Allerdings ist boost::mutex explizit nicht kopierkonstruierbar, da es allgemein unklar ist, was die Semantik beim Kopieren eines Mutex sein soll. Da boost::mutex nicht kopierbar ist, kann das Einfügen eines solchen Werts mit pointCloudsMutexes_[index] nicht kompiliert werden.

Die beste Abhilfe ist etwas geteilt Zeiger auf boost::mutex als abgebildeten Typs zu verwenden, z:

#include <boost/smart_ptr/shared_ptr.hpp> 
#include <boost/thread/mutex.hpp> 
#include <map> 

struct MyMutexWrapper { 
    MyMutexWrapper() : ptr(new boost::mutex()) {} 
    void lock() { ptr->lock(); } 
    void unlock() { ptr->unlock(); } 
    boost::shared_ptr<boost::mutex> ptr; 
}; 

int main() { 
    int const index = 42; 
    std::map<int, MyMutexWrapper> pm; 
    pm[index].lock(); 
} 

PS: C 11 ++ die Anforderung entfernt für die abgebildete Art Copy-konstruierbar zu sein.

+0

Sie sagen '" C++ 11 entfernt die Voraussetzung für den zugeordneten Typ zu kopieren-konstruierbar "', so sollte der Code des Autors unter C++ 11 kompilieren? –

+0

@AlexeyAndronov ja. Probieren Sie einfach das Codebeispiel aus der Frage, und es kompiliert, wenn der Index ein "int" ist. – jotik

+0

es nicht auf meinem MSVS2015 update2 mit 'std :: map' und' std :: mutex' obwohl X_x –

1

Karte erfordern einen Kopierkonstruktor, aber leider boost::mutex hat keine öffentliche Kopie Konstruktor. Mutex wie folgt deklariert:

class mutex 
{ 
private: 
    pthread_mutex_t m; 
public: 
    BOOST_THREAD_NO_COPYABLE(mutex) 

Ich glaube nicht, dass Vektor auch funktioniert, sollte es das gleiche Problem haben. Können Sie push_back ein boost::mutex in Vektor?

+0

es ist nicht "unglücklich", dass ein Mutex Mutex nicht kopierbar ist - es ist extrem glücklich. Es stellt eine zugrunde liegende Datenstruktur dar, die nicht verschoben werden darf. –

+0

@Richard stimme ich zu :) –

Verwandte Themen