从多个线程读取全局数据是否安全?

时间:2010-06-09 14:47:59

标签: c++ multithreading

方案如下:

  1. 创建一个类的实例(std :: map)和 将它作为全局变量疼痛。
  2. 产生线程。
  3. 线程读取并使用相同的全局 类的实例(调用方法,访问成员等)
  4. 所有衍生线程退出
  5. 全局类实例被销毁
  6. 没有使用互斥锁,没有生成线程修改全局类实例。

    这样可以吗?

    谢谢

4 个答案:

答案 0 :(得分:6)

只要您从未写过该课程,您就应该安全。

但是,只要您需要阅读或写作,就需要使用互斥锁来保护阅读和写作。

您可能希望了解“可共享锁定”的想法:

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

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

答案 1 :(得分:2)

通常是的,但这不是一个很难的保证。

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

答案 2 :(得分:1)

只要没有线程正在写入,就可以安全地读取全局数据。

答案 3 :(得分:1)

只要保证数据不会同时发生变异,就可以安全地阅读。

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

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

此外,如果您之后没有修改map,则应该在Loki::AssocVector:相同的界面处达到峰值,但对于只读使用会更快。