我目前正在尝试使用 boost::mutex 编写一个线程安全的单例(至少在构造和销毁方面)。我读到,boost mutex 无法静态初始化(我丢失了阅读它的链接,抱歉),所以为了解决这个问题,我尝试了这个,如果构造和销毁的线程安全性是:
static T& getInstance()
{
#ifndef STATIC_VARIABLES_ARE_THREADSAFE
boost::mutex mutex;
boost::lock_guard lock(mutex);
#endif
static T instance;
return instance;
}
这是线程安全的,还是应该使用 boost::call_once ?与此方法相比, boost 一次会给我带来任何性能优势吗?
编辑: 好吧,我的第一个想法显然是不正确的。为了澄清问题。 boost::mutex 可以安全地静态初始化吗?像这样:
class Singleton
{
private:
static boost::mutex m_mutex;
public:
static Singleton & getInstance()
{
boost::lock_guard lock(m_mutex);
static T instance;
return instance;
}
};
这是一种可行的方法,还是静态初始化 boost::mutex 实际上不安全(这是我读到的)?
编辑2: 啊,顺便说一下,这是链接http://uint32t.blogspot.com/2007/12/you-lazy-bastard-part-1.html
最佳答案
由于函数的每个入口都会创建自己的锁,因此锁将完全无用;任意数量的线程都可以进入该函数,锁定不同的锁,并同时开始处理静态数据。
您可以在文件(或类静态)范围内创建锁;这将确保它及时创建,前提是您不在 main()
之前启动线程。但是,即使在初始化静态数据之后,这也会序列化函数的条目。
为什么不首先在文件(或类静态)范围内定义静态数据?
关于c++:我的单例的 getInstance() 方法是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6116520/