准线程安全:map中原素个数改变才加锁,适合读频繁,写不频繁的情况;
#include"mutex"
#include"unordered_map"
template
class dict_safe_base
{
private:
std::unordered_map
std::mutex _mutex;
public:
dict_safe_base()
{
}
std::vector
{
std::lock_guard
return visitor_fun(_map);
}
V get(K& k)
{
std::lock_guard
auto serch = _map.find(k);
return (_map.end()!=serch) ? serch->second : nullptr;
}
void add(K& k, V& v)
{
std::lock_guard
_map.insert({k,v});
}
void add(const std::unordered_map
{
std::lock_guard
_map.insert(m.begin(), m.end());
}
void add_replace(K& k, V& v)
{
std::lock_guard
_map[k]=v;
}
void add_replace(const std::unordered_map
{
std::lock_guard
for(auto&d:m)
{
_map[d.first]=d.second;
}
}
void erase(K& k)
{
std::lock_guard
_map.erase(k);
}
void erase(const std::unordered_map
{
std::lock_guard
for(auto& k:m)
{
_map.erase(k.first);
}
//_map.erase(m.begin(), m.end());//不可以,会出错
}
void erase(const std::vector
{
std::lock_guard
for(auto& k:keys)
{
_map.erase(k);
}
}
uint32_t size()
{
std::lock_guard
return _map.size();
}
void clear()
{
std::lock_guard
_map.clear();
}
virtual ~dict_safe_base()
{
}
};
struct test_val
{
test_val(int key, std::string val):val(val),key(key)
{
}
std::string val;
int key;
void print()
{
std::cout<
};
typedef std::shared_ptr
std::vector
{
std::vector
for(auto& d:m)
{
if(d.first%2==0)
{
ret.push_back(d.second);
}
}
return ret;
}
class test:public dict_safe_base
{
};
int main()
{
test data;
std::cout<
{
auto kk(std::make_shared
data.add(i, kk);
}
// 0:str0
// 1:str1
// 2:str2
for(int i=0;i<3;i++)
{
if(data.get(i))
data.get(i)->print();
}
int i=1;
data.erase(i);
// 0:str0
// 2:str2
for(int i=0;i<3;i++)
{
if(data.get(i))
data.get(i)->print();
}
data.clear();
std::unordered_map
for(int i=0;i<5;i++)
{
auto kk(std::make_shared
dict.insert(std::make_pair(i, kk));
}
// 0:str0
// 1:str1
// 2:str2
// 3:str3
// 4:str4
data.add(dict);
for(int i=0;i<5;i++)
{
if(data.get(i))
data.get(i)->print();
}
dict.clear();
std::vector
for(int i=0;i<5;i+=2)
{
keys.push_back(i);
auto kk(std::make_shared
dict.insert(std::make_pair(i, kk));
}
// 1:str1
// 3:str3
data.erase(dict);
for(int i=0;i<5;i++)
{
if(data.get(i))
data.get(i)->print();
}
// 0:str0
// 1:str1
// 2:str2
// 3:str3
// 4:str4
auto kk(std::make_shared
dict.insert(std::make_pair(1, kk));
data.add(dict);
for(int i=0;i<5;i++)
{
if(data.get(i))
data.get(i)->print();
}
// 0:str0
// 1:str14
// 2:str2
// 3:str3
// 4:str4
// 10:str14
dict.insert(std::make_pair(10, std::make_shared
data.add_replace(dict);
for(int i=0;i<50;i++)
{
if(data.get(i))
data.get(i)->print();
}
// 10:str14
// 0:str0
// 2:str2
// 4:str4
for(auto&kk:data.visit(visit_fun))
{
kk->print();
}
// 1:str14
// 3:str3
// 10:str14
data.erase(keys);
for(int i=0;i<50;i++)
{
if(data.get(i))
data.get(i)->print();
}
std::cout< return 0;
}