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

爱德华·罗斯托米安

我们到了:

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:

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

可以在此处产生数据竞争条件,包括分段错误(线程 B 正在尝试使用不再存在的对象)。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么std :: condition_variable的notify和wait函数都需要锁定的互斥锁

来自分类Dev

以类似方式处理std :: map <K,V>和std :: map <K,V *>

来自分类Dev

std :: map <K,V> :: mapped_type的限制是什么?

来自分类Dev

什么是 std::map<K,V>::map; 以及如何知道在实现/使用 stl 容器和函数时使用什么命名空间?

来自分类Dev

使用透明的std函数对象时,我们是否仍需要写空尖括号?

来自分类Dev

了解std :: map :: find

来自分类Dev

我们是否需要在天蓝色函数中照顾垃圾收集?

来自分类Dev

我们是否需要在仅包含函数的文件上定义外壳?

来自分类Dev

互斥锁是否适用于锁定后调用的函数?

来自分类Dev

为什么我们需要在使用 map 函数时将 list 写在前面,因为 split() 已经返回了一个列表?

来自分类Dev

为什么我们需要 std::partition_point 而我们可以使用 std::find_if_not 算法?

来自分类Dev

为什么在std :: map上基于范围的for循环中的const std :: pair <K,V>&不起作用?

来自分类Dev

我们不能管理std :: map <string,ofstream>吗?

来自分类Dev

如何使 std::map::find 函数区分大小写?

来自分类Dev

为什么std :: map具有find成员函数?

来自分类Dev

为什么我们需要互斥锁等待通知

来自分类Dev

std :: map <struct,int>我需要析构函数吗?

来自分类Dev

为什么Map <K,V>不扩展Function <K,V>?

来自分类Java

如何从Map <K,Collection <V >>创建Multimap <K,V>?

来自分类Dev

将 RDD[(K,V) 转换为 Map[K,List[V]]

来自分类Dev

如何在 Typescript 的 Map<K,V[]> 中定义对类型 V 进行操作的扩展函数?

来自分类Dev

如果多个线程使用公共方法读取特定键的值,我们是否需要在私有静态 Map 对象上进行同步?

来自分类Dev

std::map<int, std::bitset<256 > > 没有互斥锁的线程安全?

来自分类Dev

长时间锁定互斥锁是否安全?

来自分类Dev

互斥锁已经被我锁定了吗?

来自分类Dev

我是否需要在构造函数中显式初始化std :: unique_ptr?

来自分类Dev

为什么F#的惯用词典集合(Map <K,V>)需要类型K来实现可比的而C#的Dictionary <K,V>却不需要?

来自分类Dev

我是否需要在指针向量上使用互斥锁?

来自分类Dev

从文件收集信息到Map <K,V>

Related 相关文章

  1. 1

    为什么std :: condition_variable的notify和wait函数都需要锁定的互斥锁

  2. 2

    以类似方式处理std :: map <K,V>和std :: map <K,V *>

  3. 3

    std :: map <K,V> :: mapped_type的限制是什么?

  4. 4

    什么是 std::map<K,V>::map; 以及如何知道在实现/使用 stl 容器和函数时使用什么命名空间?

  5. 5

    使用透明的std函数对象时,我们是否仍需要写空尖括号?

  6. 6

    了解std :: map :: find

  7. 7

    我们是否需要在天蓝色函数中照顾垃圾收集?

  8. 8

    我们是否需要在仅包含函数的文件上定义外壳?

  9. 9

    互斥锁是否适用于锁定后调用的函数?

  10. 10

    为什么我们需要在使用 map 函数时将 list 写在前面,因为 split() 已经返回了一个列表?

  11. 11

    为什么我们需要 std::partition_point 而我们可以使用 std::find_if_not 算法?

  12. 12

    为什么在std :: map上基于范围的for循环中的const std :: pair <K,V>&不起作用?

  13. 13

    我们不能管理std :: map <string,ofstream>吗?

  14. 14

    如何使 std::map::find 函数区分大小写?

  15. 15

    为什么std :: map具有find成员函数?

  16. 16

    为什么我们需要互斥锁等待通知

  17. 17

    std :: map <struct,int>我需要析构函数吗?

  18. 18

    为什么Map <K,V>不扩展Function <K,V>?

  19. 19

    如何从Map <K,Collection <V >>创建Multimap <K,V>?

  20. 20

    将 RDD[(K,V) 转换为 Map[K,List[V]]

  21. 21

    如何在 Typescript 的 Map<K,V[]> 中定义对类型 V 进行操作的扩展函数?

  22. 22

    如果多个线程使用公共方法读取特定键的值,我们是否需要在私有静态 Map 对象上进行同步?

  23. 23

    std::map<int, std::bitset<256 > > 没有互斥锁的线程安全?

  24. 24

    长时间锁定互斥锁是否安全?

  25. 25

    互斥锁已经被我锁定了吗?

  26. 26

    我是否需要在构造函数中显式初始化std :: unique_ptr?

  27. 27

    为什么F#的惯用词典集合(Map <K,V>)需要类型K来实现可比的而C#的Dictionary <K,V>却不需要?

  28. 28

    我是否需要在指针向量上使用互斥锁?

  29. 29

    从文件收集信息到Map <K,V>

热门标签

归档