【问题标题】:Is it safe to read global data from multiple threads?从多个线程读取全局数据是否安全?
【发布时间】:2010-06-09 14:47:58
【问题描述】:

场景如下:

  1. 创建一个类的实例 (std::map) 和 将其作为全局变量。
  2. 产生线程。
  3. 线程读取和使用相同的全局 类的实例(调用方法、访问成员等)
  4. 所有衍生线程退出
  5. 全局类实例被销毁

没有使用互斥体,没有生成线程修改全局类实例。

这样好吗?

谢谢

【问题讨论】:

  • 你的意思是:阅读安全吗...

标签: c++ multithreading


【解决方案1】:

只要你从不写信给那个班级,你就应该是安全的。

但是,一旦您需要进行读取或写入,您将需要使用互斥锁来保护读取和写入。

您可能想研究“可共享锁”的想法:

Boost 有一个允许快速读取的锁,但还包括在必要时将锁升级为“写入器”的选项。我认为这可能对未来的验证很有价值。

http://www.boost.org/doc/libs/1_39_0/doc/html/thread/synchronization.html#thread.synchronization.mutex_concepts.shared_lockable

【讨论】:

    【解决方案2】:

    通常是的,但这不是硬性保证。

    核心问题是你需要一个内存屏障来确保第一个线程将所有数据从寄存器写回内存。但是,这很可能会在您创建第二个线程时发生。

    【讨论】:

      【解决方案3】:

      读取全局数据是安全的,只要没有线程在写入。

      【讨论】:

        【解决方案4】:

        只要保证数据不会同时发生变异,读取是安全的。

        我会使用const 资格来确保它。

        const std::map<Key,Value> global = ...;
        

        另外,如果您之后不修改map,您应该在Loki::AssocVector 上达到峰值:相同的界面,但对于只读使用更快。

        【讨论】:

          猜你喜欢
          • 2011-11-27
          • 1970-01-01
          • 2012-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多