【问题标题】:Is the go map structure thread-safe?go map 结构是线程安全的吗?
【发布时间】:2010-12-31 21:41:36
【问题描述】:

Go map 类型的线程安全吗?我有一个程序,它有许多 goroutine 读取和写入映射类型。如果我需要实施保护机制,最好的方法是什么?

【问题讨论】:

    标签: multithreading map go goroutine


    【解决方案1】:

    您希望使用 goroutine 并通过 channels 同步访问您的地图。来自the FAQ的解释:

    经过长时间的讨论,决定地图的典型用法 不需要从多个线程进行安全访问,在这些情况下 在那里,地图可能是一些更大的数据结构的一部分 或已经同步的计算。因此要求 所有映射操作都获取互斥锁会减慢大多数程序并添加 安全到少数。然而,这并不是一个容易的决定,因为这意味着 不受控制的地图访问可能会导致程序崩溃。

    该语言不排除原子映射更新。需要时,如 就像托管一个不受信任的程序一样,实现可以 联锁地图访问。

    【讨论】:

    • 这是明智的,但他们仍然应该记录和维护哪些函数是线程安全的。我经常遇到代码,在 pass1 中我用值填充映射,而在 pass2 中我从许多不同的线程同时读取它,而没有一次同步。
    • Go 风格似乎非常反对使用共享可变状态。如果你只是从不同的线程读取地图,你应该没问题。 (尽管这并非绝对不言而喻;有一些合理的地图实现在逻辑读取时会发生物理突变......)
    【解决方案2】:

    由于Go 1.9,最好的方法是使用sync.Map类型。

    【讨论】:

      猜你喜欢
      • 2013-11-07
      • 2011-01-22
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      相关资源
      最近更新 更多