LINUX.ORG.RU

История изменений

Исправление 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();
  }
  
}