AHTOXA 14 10 апреля, 2020 Опубликовано 10 апреля, 2020 · Жалоба 2 часа назад, Axel сказал: конечно же объекты удаляются. Обычно такого в синглтонах не предусматривается. Как это реализовано? Статическая функция класса для удаления? И самый главный вопрос: как контролируется, что два взаимоисключающих синглтона не будут созданы одновременно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Axel 1 10 апреля, 2020 Опубликовано 10 апреля, 2020 · Жалоба 2 hours ago, AHTOXA said: Обычно такого в синглтонах не предусматривается. Как это реализовано? Статическая функция класса для удаления? И самый главный вопрос: как контролируется, что два взаимоисключающих синглтона не будут созданы одновременно? Например так (при использовании placement new): static CFooA * Instance() { CFooA *ret_val = 0; if(CClassFooId::FooInstance) { if(sem_polling(&CClassFooId::UseCounter) != SEM_NOT_IN_USE) { if(CClassFooId::FooInstance->GetClassId() != FOO_A_CLASS_ID) { CClassFooId::FooInstance = 0; } } else { ret_val = INST_CREATE_ERR; } } if(!ret_val) { if(!CClassFooId::FooInstance) { mutex_lock(&InstMutex, WAIT_INFINITE); if(!CClassFooId::FooInstance) { CClassFooId::FooInstance = (CClassFooId *)new ((void *)FooMemPool) CFooA(); } mutex_unlock(&InstMutex); } ret_val = (CFooA *)CClassFooId::FooInstance; } else { ret_val = 0; } return ret_val; } static CClassFooId *ClearInatance() { if(sem_polling(&CClassFooId::UseCounter) == SEM_NOT_IN_USE) { CClassFooId::FooInstance = 0; } return CClassFooId::FooInstance; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 11 апреля, 2020 Опубликовано 11 апреля, 2020 · Жалоба Если я правильно понял, то при использовании вашего синглтона недостаточно просто вызвать CFooA::Instance(), а нужно предварительно захватывать семафор CClassFooId::UseCounter? Тогда это так себе вариант. Ведь суть синглтона в том, что программист не может сделать неправильно. А в вашем случае - запросто: auto a = CFooA::Instance(); auto b = CFooB::Instance(); // здесь a испортили а->foo(); // кирдык! В общем, идея понятная, но от собственно синглтона здесь мало что есть. Вернее, это уже не синглтон, а какая-то другая конструкция :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться