Tôi cần tạo một bản đồ an toàn cho luồng, trong đó tôi có nghĩa là mỗi giá trị phải được tắt tiếng độc lập. Ví dụ, tôi cần để có thể nhận được map["abc"]
và map["vf"]
cùng một lúc từ 2 chủ đề khác nhau.Bản đồ của mutex C++ 11
Ý tưởng của tôi là làm cho hai bản đồ: một cho dữ liệu và một cho mutex cho mỗi phím:
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();
}
tôi thấy rằng tôi không thể tạo bản đồ từ chuỗi mutex, vì không có constructor sao chép trong std::mutex
và tôi phải sử dụng std::unique_ptr
; nhưng khi tôi biên dịch, tôi nhận được:
/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>);
^
Làm cách nào để giải quyết vấn đề này?
+1 cho 'std :: make_unique ' –
FWIW, bạn nên sử dụng' make_unique' trong C++ 11 quá. –