我有一个类T
,并且希望该类的单个全局对象由访问器函数(如T const& read_singleton()
和T& modify_singleton()
(给定。T
的默认构造函数应在首次使用其中一个函数时实例化对象,并且函数的使用应是线程安全的。实现这一点的(好的(设计模式是什么?
编写这些函数很容易:
T& modify_singleton()
{
T static t{};
return t;
}
T const& read_singleton()
{
return modify_singleton();
}
这是Meyers单例模式,也可以作为T
的静态函数来实现,以防您控制其实现并希望使其构造函数/析构函数等私有。
变量t
的初始化将是线程安全的。然而,当多个线程获得一个T&
时会发生什么,这超出了modify_singleton
的控制范围。您必须协调对对象的修改,要么使用全局互斥,要么将其类设计为线程安全。如果不能修改类T
,还可以通过包装器类提供线程安全接口。