我们到了:
template<typename TK, typename TV>
class MetaAssociator
{
public:
void Set(TK key, TV const & value)
{
boost::lock_guard<boost::mutex> lock(m_Mutex);
m_Map[key] = value;
}
TV Get(TK key) const
{
boost::lock_guard<boost::mutex> lock(m_Mutex); // this one
std::map<TK,TV>::const_iterator iter = m_Map.find(key);
return iter == m_Map.end() ? TV() : iter->second;
}
private:
mutable boost::mutex m_Mutex;
std::map<TK,TV> m_Map;
};
我们真的需要在 get 函数中锁定互斥锁吗?我们只提供只读访问。如果我们不这样做呢?
是的,我们需要它。
假设有 2 个线程 A 和 B:
可以在此处产生数据竞争条件,包括分段错误(线程 B 正在尝试使用不再存在的对象)。
我们可以使用互斥锁来保护这些部分(如您的示例中所示)。另一种选择是使用读写锁。读写锁的优点是允许并发读访问。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句