【发布时间】:2009-06-27 12:02:16
【问题描述】:
以下是众所周知的 C++ 中单例模式的实现。
但是,我不完全确定它是否是线程安全的。
根据之前在此处提出的类似问题的答案,它似乎是线程安全的。
是这样吗?
//Curiously Recurring Template Pattern
//Separates a class from its Singleton-ness (almost).
#include <iostream>
using namespace std;
template<class T> class Singleton {
Singleton(const Singleton&);
Singleton& operator=(const Singleton&);
protected:
Singleton() {}
virtual ~Singleton() {}
public:
static T& instance() {
static T theInstance;
return theInstance;
}
};
// A sample class to be made into a Singleton
class MyClass : public Singleton<MyClass> {
int x;
protected:
friend class Singleton<MyClass>;
MyClass() { x = 0; }
public:
void setValue(int n) { x = n; }
int getValue() const { return x; }
};
【问题讨论】:
-
你为什么要把它做成一个 WIKI?这是一个完全有效的问题。
-
你没有给出任何理由说明你认为模式实现不是线程安全的。请做。
-
这里的朋友班的目的是什么?有人可以回答吗?
-
哦,拍!应该检查常见问题以了解它的含义,而不是假设它是什么。
-
@Ahmed。它用于编译语句“static T theInstance”。如您所见,MyClass 具有受保护的构造函数,因此我们需要朋友说明符,以便 Singleton 类(准确地说是 Singleton
)可以声明 MyClass 类型的本地静态。
标签: c++ multithreading design-patterns