Поскольку ваши объекты являются локальными для потоков, зачем вам вообще нужна блокировка для их защиты? Каждый поток, который вызывает getInstance (), будет независимым от любого другого потока, так почему бы просто не проверить, существует ли синглтон, и создать его при необходимости? Блокировка понадобится только в том случае, если несколько потоков будут пытаться получить доступ к одному и тому же синглтону, что невозможно в вашем проекте, как указано выше.
РЕДАКТИРОВАТЬ: Переходя к двум другим вопросам ... Я не вижу никакой причины, почему использование TlsAlloc / TlsGetValue и т. Д. Не будет работать так, как вы ожидаете. Поскольку память, содержащая указатель на ваш синглтон, доступна только соответствующему потоку, проблем с ленивой инициализацией не возникнет. Однако нет явного интерфейса обратного вызова для их очистки.
Очевидным решением этого было бы наличие метода, который вызывается всеми основными функциями вашего потока, который очищает созданный синглтон, если таковой имеется.
Если очень вероятно, что поток создаст сингелтон, более простой шаблон может состоять в том, чтобы создать синглтон в начале основной функции потока и удалить его в конце. Затем вы можете использовать RAII, создавая одиночный файл в стеке или удерживая его в std :: auto_ptr <>, чтобы он удалялся по окончании потока. (Если поток не завершится ненормально, но если это произойдет, все ставки отключены, и утечка объекта - наименьшая из ваших проблем.) Затем вы можете просто передать одиночный код, или сохранить его в TLS, или сохранить его в элементе класс, если большая часть функциональности потока находится в одном классе.