У меня есть некоторая конфигурация приложения, хранящаяся в синглтоне. В настоящее время я реализовал его со стандартной статической переменной: < /p>
Код: Выделить всё
class config {};
auto &get_config() { static config instance; return instance; }
Я хотел бы, чтобы это было подсчетом, так что класс config , который потенциально может стать довольно тяжелым, не остался, как только никто больше не использует его. Если кто -то хочет использовать его снова, я в порядке, начиная с нуля и потерю предыдущей конфигурации. Конечно, это безопасно для многопоточного использования. Предположим, что сам класс config является безопасным.
Код: Выделить всё
#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