我想创建一个在使用它的每个线程中实例化一次的单例类。我想将实例指针存储在 TLS 插槽中。我想出了以下解决方案,但我不确定当涉及线程本地存储时,多线程访问单格顿工厂是否有任何特殊考虑。也许还有更好的解决方案来实现线程本地单例。
class ThreadLocalSingleton
{
static DWORD tlsIndex;
public:
static ThreadLocalSingleton *getInstance()
{
ThreadLocalSingleton *instance =
static_cast<ThreadLocalSingleton*>(TlsGetValue(tlsIndex));
if (!instance) {
instance = new ThreadLocalSingleton();
TlsSetValue(tlsIndex, instance);
}
return instance;
}
};
DWORD ThreadLocalSingleton::tlsIndex = TlsAlloc();
Tls* 函数当然是特定于 win32 的,但可移植性不是这里的主要问题。您对其他平台的想法仍然很有价值。
主要编辑:我最初询问过在这种情况下使用双重检查锁定。然而,正如DavidK指出的那样,无论如何,单例都是基于每个线程创建的。
剩下的两个问题是:
是否适合回复 TlsGetValue/TlsSetValue 以确保每个线程获得一个实例并且每个线程只创建一次实例?
是否可以注册一个回调,允许我在该线程完成时清理与特定线程关联的实例?