[英]c++: is this getInstance() method of my singleton threadsafe?
我目前正在尝试使用 boost::mutex 编写线程安全的 singleton(至少在构造和销毁方面)。 我读到 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::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 实际上不安全(这是我读到的)?
EDIT2 :啊,那是链接http://uint32t.blogspot.com/2007/12/you-lazy-bastard-part-1.html
由于 function 的每个条目都会创建自己的锁,因此锁将完全无用; 任意数量的线程都可以进入function,锁不同的锁,同时开始搞乱static数据。
您可以在文件(或 class 静态)scope 处创建锁; 这将确保它及时创建,前提是您不在main()
之前启动线程。 但是,即使在 static 数据初始化之后,这也会序列化 function 的条目。
为什么不首先在文件(或 class 静态)scope 中定义您的 static 数据?
GCC 提供 static 变量的线程安全初始化。 所以,如果你使用 GCC 你不需要关心 static 变量的正确初始化
尝试使用 Meyers Singleton 实现。
class MySingleton {
public:
static MySingleton& getInstance() {
static MySingleton instance;
return instance;
}
private:
MySingleton();
~MySingleton();
MySingleton(const MySingleton&)= delete;
MySingleton& operator=(const MySingleton&)= delete;
};
MySingleton::MySingleton()= default;
MySingleton::~MySingleton()= default;
// Usage
int main() {
MySingleton::getInstance();
}
您确实需要使用锁定。 但是,您提出的boost::mutex
方案被破坏了,因为您在堆栈上分配了互斥锁,并且多个并发调用者将各自获得自己的互斥锁。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.