【发布时间】:2009-11-11 03:23:32
【问题描述】:
所以我想从多个线程访问一个单例类。从概念上讲,我认为在这个单例实例上调用非常量方法不是线程安全的。我一直在网上寻找,似乎没有人解决这个可能的问题。这是否存在实际问题,Singleton 的线程安全的唯一问题是实例变量的初始化吗?
【问题讨论】:
标签: c++ multithreading singleton
所以我想从多个线程访问一个单例类。从概念上讲,我认为在这个单例实例上调用非常量方法不是线程安全的。我一直在网上寻找,似乎没有人解决这个可能的问题。这是否存在实际问题,Singleton 的线程安全的唯一问题是实例变量的初始化吗?
【问题讨论】:
标签: c++ multithreading singleton
单例实例与任何其他实例具有相同的线程安全问题,因此对其方法的调用或对其成员的访问应该同步。
单例本身的初始化是另一个问题...在 gcc 中静态初始化是threadsafe,但在其他平台上可能没有那么多。
还可以看看这个paper 解决了 Andrei Alexandrescu 的一些线程单例问题。他的 Modern C++ Design book 还解决了单例问题。
【讨论】:
你是对的,调用非常量方法或依赖于实例数据的方法,可以被其他线程修改。
【讨论】:
除了初始化实例变量的线程安全问题外,在方法调用的线程安全方面,单例对象应该被视为任何其他普通对象。
ie,多线程访问的单例对象的任何方法(如果我们试图读取一个变量的值,该变量的值将由另一个线程在另一个方法中更新,则您也需要对 const 方法进行同步)并涉及在共享数据中读写必须同步。
【讨论】: