gpt4 book ai didi

c++ - 我们需要在 std::map::find 函数周围锁定互斥量吗?

转载 作者:太空宇宙 更新时间:2023-11-04 14:37:49 26 4
gpt4 key购买 nike

我们在这里:

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 函数中锁定 mutex 吗?我们仅提供只读访问权限。如果我们不这样做呢?

最佳答案

是的,我们需要它。

假设有 2 个线程 A 和 B:

  • 线程A正在设置值。
  • 线程 B 正在同时读取这个值。

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

我们可以使用互斥锁来保护这些部分(就像在您的示例中一样)。另一种选择是使用 read and write lock .读写锁的优点是允许并发读取访问。

关于c++ - 我们需要在 std::map<K, V>::find 函数周围锁定互斥量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49736646/

26 4 0