如下示例代码,线程1在add方法中对map进行插入和查找,线程2在check方法中对整个map遍历,删除满足某种条件的元素,add方法中是一进去就加锁,如果在check方法中m_map.begin()前就加锁,假如遍历完要5秒,那add方法岂不是要阻塞5秒?check中的遍历是需要尽快完成的,所以每次循环也不能休眠太久,有没有什么既高效又安全的加锁方法?
//xx.h
class xx{
boost::unordered_map<unsigned int, std::shared_ptr<A>> m_map;
};
//xx.cpp
void xx::add(shared_ptr<A> data){
...
//加锁(函数退出自动释放)
std::shared_ptr<A> pA = nullptr;
auto it = m_map.find(key);
if (it == m_map.end()){
m_map.insert(std::make_pair(key, data));
} else {
pA = it->second;
}
...
}
...
void xx::check(){
//加锁(函数退出自动释放)
auto it = m_map.begin();
while (it != m_map.end()){
if(it->second->ts > TIMEOUT){
m_map.erase(it++);
休眠5毫秒
continue;
}
it++;
休眠5毫秒
}
}