我们是否需要在std :: map <K,V> :: find函数周围锁定互斥锁?

Edu*_*yan 0 c++ multithreading boost mutex

我们到了:

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;
};
Run Code Online (Sandbox Code Playgroud)

我们真的需要在get函数中锁定互斥锁吗?我们只提供只读访问权限.如果我们不怎么办?

amc*_*con 5

是的,我们需要它.

我们假设2个线程A和B:

  • 线程A正在设置值.
  • 线程B同时读取该值.

这里可以产生数据竞争条件,包括分段错误(线程B试图使用不再存在的对象).

我们可以使用互斥锁来保护这些部分(如您的示例中所示).另一种选择是使用读写锁.读写锁的优点是允许并发读访问.