История изменений
Исправление
nanoolinux,
(текущая версия)
:
Да сделай в make поиск, если нет - создал, заинсертил, вернул; если есть - залочил, вернул. И всё это с мутексом. А в делетере удаляй нафиг всё, и тоже с мутексом.
Что-то вроде:
std::shared_ptr <A> make(ID id) {
ScopedLock l(mutex);
auto it = map->find(id);
if (it == map->end()) {
std::weak_ptr <A> w;
std::shared_ptr <A> s(new A, [&, =id] (A *p) {
ScopedLock l(mutex);
auto it = map->find(id);
map->erase(it);
delete p;
});
w = s;
map->insert({id, w});
return s;
} else {
return it->second->lock();
}
}
Исправление
nanoolinux,
:
Да сделай в make поиск, если нет - создал, заинсертил, вернул; если есть - залочил, вернул. И всё это с мутексом. А в делетере удаляй нафиг всё, и тоже с мутексом.
Что-то вроде:
std::shared_ptr <A> make(ID id) {
ScopedLock l(mutex);
auto it = map->find(id);
if (it == map->end()) {
std::weak_ptr <A> w;
std::shared_ptr <A> s(new A, [&, =id] (A *p) {
ScopedLock l(mutex);
auto it = map->find(id);
map->erase(it);
delete p;
});
w = s;
map->insert({id, w});
return s;
} else {
return it->lock();
}
}
Исходная версия
nanoolinux,
:
Да сделай в make поиск, если нет - создал, заинсертил, вернул; если есть - залочил, вернул. И всё это с мутексом. А в делетере удаляй нафиг всё, и тоже с мутексом.
Что-то вроде:
std::shared_ptr <A> make(ID id) {
ScopedLock l(mutex);
auto it = map->find(id);
if (it != map->end()) {
std::weak_ptr <A> w;
std::shared_ptr <A> s(new A, [&, =id] (A *p) {
ScopedLock l(mutex);
auto it = map->find(id);
map->erase(it);
delete p;
});
w = s;
map->insert({id, w});
return s;
} else {
return it->lock();
}
}