如何解决c ++:我的单例线程安全的此getInstance方法安全吗?
| 我目前正在尝试使用boost :: mutex编写一个线程安全的单例(至少在构造和破坏方面)。我读到boost互斥体不能静态初始化(抱歉,我丢失了阅读它的链接),所以如果构建和销毁的线程安全性为: 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(我读到的内容)不安全?
编辑2:
嗯,这就是http://uint32t.blogspot.com/2007/12/you-lazy-bastard-part-1.html上的链接
解决方法
由于该函数的每个条目都会创建自己的锁,因此该锁将完全无用。任何数量的线程都可以进入该函数,锁定不同的锁,并同时开始处理静态数据。
您可以在文件(或类静态)范围内创建锁;前提是您没有在
main()
之前启动线程,这将确保它被及时创建。但是,即使在初始化静态数据之后,这也会序列化该函数的条目。
为什么不首先在文件(或类静态)范围内定义静态数据?
,GCC提供静态变量的线程安全初始化。
因此,如果您使用GCC,则无需担心静态变量的正确初始化
,您确实需要使用锁定。但是,您建议的“ 3”方案被破坏了,因为您在堆栈上分配了互斥锁,并且多个并发调用者将各自获得自己的互斥锁。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。