Ссылка подсчитала СинглтонC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Ссылка подсчитала Синглтон

Сообщение Anonymous »

У меня есть некоторая конфигурация приложения, хранящаяся в синглтоне. В настоящее время я реализовал его со стандартной статической переменной: < /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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»