Ich muss eine thread-sichere Karte machen, wobei ich meine, dass jeder Wert unabhängig Mutexed sein muss. Zum Beispiel muss ich in der Lage sein, map["abc"]
und map["vf"]
gleichzeitig aus 2 verschiedenen Threads zu bekommen.Karte von Mutex C++ 11
Meine Idee ist, zwei Karten zu erstellen: ein für Daten und einen für Mutex für jeden Schlüssel:
class cache
{
private:
....
std::map<std::string, std::string> mainCache;
std::map<std::string, std::unique_ptr<std::mutex> > mutexCache;
std::mutex gMutex;
.....
public:
std::string get(std::string key);
};
std::string cache::get(std::string key){
std::mutex *m;
gMutex.lock();
if (mutexCache.count(key) == 0){
mutexCache.insert(new std::unique_ptr<std::mutex>);
}
m = mutexCache[key];
gMutex.unlock();
}
finde ich, dass ich nicht Karte von String Mutex erstellen kann, weil es keine Kopie Konstruktor in std::mutex
und ich muss std::unique_ptr
verwenden; aber wenn ich das kompiliere bekomme ich:
/home/user/test/cache.cpp:7: error: no matching function for call to 'std::map<std::basic_string<char>, std::unique_ptr<std::mutex> >::insert(std::unique_ptr<std::mutex>*)'
mutexCache.insert(new std::unique_ptr<std::mutex>);
^
Wie löse ich dieses Problem?
+1 für 'std :: make_unique' –
FWIW, sollten Sie 'make_unique' in C++ 11 verwenden. –