Рассмотрим следующую единственную реализацию C ++, использующую pthread_once для безопасной инициализации потока:
class MySingleton
{
public:
static MySingleton* Instance();
protected:
MySingleton() {};
static void InitOnce();
private:
static MySingleton* instance;
};
MySingleton* MySingleton::instance = NULL;
pthread_once_t singleton_once_control = PTHREAD_ONCE_INIT;
MySingleton* MySingleton::Instance()
{
pthread_once(&singleton_once_control, &InitOnce);
return instance;
}
void MySingleton::InitOnce()
{
instance = new MySingleton;
}
Проблема в том, что pthread_once нужна функция обратного вызова, чтобы иметь C-linkage.(Хорошо, это всего лишь предупреждение компилятора, и в среде, где я тестирую этот код, работает, потому что соглашения о вызовах функций C и C ++ являются двоично-совместимыми)
Но есть ли хороший образец для реального кроссплатформенного решения?Вы можете создать функцию-обертку C-linkage, но она не может быть частью класса и, следовательно, вызвать частную функцию init InitOnce.
Есть ли какое-либо решение, которое не позволяет сделать InitOnce общедоступным?
PS Да, одиночные игры плохие.Давайте не будем об этом ...