2010-06-09 209 views
2

的情况如下:从多个线程读取全局数据安全吗?

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

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

可以吗?

谢谢

+0

您的意思是:阅读安全吗? – lsalamon 2010-06-09 14:54:11

回答

2

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

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

6

只要你从未写入该类,你应该是安全的。

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

你可能想寻找到一个“共享锁”的想法:

升压具有这样的锁,允许快速读取,同时也包括在必要时将锁升级到“作家”的选项。我认为这对于未来的发展可能是有价值的。

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

1

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

1

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

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

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

另外,如果你没有修改map之后,你应该在Loki::AssocVector采取高峰:相同的接口,但对于只读的使用速度更快。