所以我想从多个线程访问一个单例类。从概念上讲,我认为在这个单例实例上调用非const方法不是线程安全的。我一直在网上看,似乎没有人解决这个可能的问题。这是否存在实际问题,是Singleton线程安全的唯一问题,即实例变量的初始化?
答案 0 :(得分:2)
单例实例与任何其他实例具有相同的线程安全问题,因此应该同步对其方法的调用或对其成员的访问。
单例本身的初始化是另一个问题......在gcc静态初始化中是threadsafe,但在其他平台上可能没那么多。
另请参阅此paper解决Andrei Alexandrescu撰写的一些线程单例问题。他的现代C ++设计book也解决了单例问题。
答案 1 :(得分:1)
你是对的,调用依赖于其他线程可以修改的实例数据的非const方法或方法必须同步。
答案 2 :(得分:0)
除了初始化实例变量的线程安全问题外,单例对象应该被视为与方法调用的线程安全性相关的任何其他普通对象。
ie,任何方法(你需要同步const方法,如果我们试图读取一个变量的值,它将由另一个线程在另一个方法中更新)由多个线程访问的单例对象并涉及在共享数据中,read \ write必须同步。