Я нашел следующий код в кодовой базе моей компании. Логика заключается в том, чтобы освободить конфигурацию singleton, когда никто не использует ее, так как было обнаружено, что некоторые пользователи раздувают его размер, который был измерен, чтобы вызвать проблемы с использованием памяти. Хотя очевидным решением было бы заставить этих пользователей убирать после себя или не хранить данные в Синглтоне вообще, право собственности на код облегчил внедрение в качестве обходного пути. < /P>
Помимо запаха кода за ним, безопасно ли поток? < /P>
Код: Выделить всё
#include
class config {};
std::shared_ptr get_config() {
static std::weak_ptr p;
if (!p) {
// No reference, create first instance
return p = std::make_shared();
} else if (auto instance = p.lock()) {
// Alive reference
return instance;
} else {
// Expired reference, create new instance
return p = std::make_shared();
}
}
Я прочитал безопасность потока shared_ptr и sleed_ptr и обнаружил, что это немного запутанно. Из того, что я понимаю, они гарантируют только безопасность базового блока -объекта и атомичности количества ссылок, но все еще не безопасно для нескольких потоков для изменения самих интеллектуальных указателей. Похоже, это подтверждено добавлением std :: atomic в C ++ 20, но как я мог решить эту потенциальную проблему в C ++ 17?
Подробнее здесь:
https://stackoverflow.com/questions/794 ... -singleton