Я хотел бы создать одноэлементный класс, который создается один раз в каждом потоке, где он используется. Я хотел бы сохранить указатели экземпляра в слотах TLS. Я придумал следующее решение, но я не уверен, есть ли какие-либо особые соображения при многопоточном доступе к фабрике singelton, когда речь идет о локальном хранилище потоков. Возможно, есть и лучшее решение для реализации потоковых локальных синглетонов.Thread-local singletons
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, но переносимость здесь не является основной проблемой. Ваши мысли о других платформах будут по-прежнему ценными.
Major Редактировать: Первоначально я спросил об использовании блокировки с двойной проверкой в этом сценарии. Однако, как указывал DavidK, синглтоны должны создаваться на основе каждой нити.
Две оставшиеся вопросы:
уместно ответить на TlsGetValue/TlsSetValue, чтобы гарантировать, что каждый поток получает один экземпляр и экземпляр создается только один раз для каждого потока?
Возможно ли зарегистрировать обратный вызов, который позволяет мне очистить экземпляр, связанный с конкретным потоком, когда этот поток заканчивается?
Ну спасибо. Я был явно в слишком сложном режиме. – VoidPointer